View 的事件分发机制

相关的方法

  1. 分发
    public boolean dispatchTouchEvent(MotionEvent ev)
    如果事件能够传递给当前 View,那么此方法一定会被调用,返回结果受当前 View 的 onTouchEvent 和下级 View 的 dispatchTouchEvent 方法影响, 表示是否消耗当前事件;
  2. 拦截
    public boolean onInterceptTouchEvent(MotionEvent event)
    返回结果表示是否拦截当前事件;
  3. 消耗
    public boolean onTouchEvent(MotionEvent event)
    用来处理点击事件,返回结果表示是否消耗当前事件。

三个方法之间的关系

public boolean dispatchTouchEvent(MotionEvent ev) {
    boolean consume = false;
    if (onInterceptTouchEvent (ev)) {
        consume = onTouchEvent (ev);
    } else {
        consume = child.dispatchTouchEvent(ev);
    }

    return consume;
}

实例分析

  1. dispatchTouchEvent 是事件分发的第一步,但是不太会去改写这个方法,所以暂时不管。

  2. Demo 地址

View 的事件分发机制_第1张图片
View 的事件分发机制.png

备注

  1. 同一个事件序列是指从手指接触屏幕那一刻起,到手指离开屏幕的那一刻结束,在这个过程中产生的一系列事件,这个序列以 down 事件开始,中间有数量不定的 move 事件,最后以 up 事件结束;
  2. 某个 View 一旦决定拦截,那么这一个事件序列都只能由它来处理,并且 onTnterceptTouchEvent 不会再被调用。

你可能感兴趣的:(View 的事件分发机制)