Touch事件分发理解

  1. Touch事件分发中只有两个主角:ViewGroup和View。
    ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。
    View包含dispatchTouchEvent、onTouchEvent两个相关事件。

  2. ViewGroup和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup。

  3. 触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。

  4. 当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历(深度优先遍历)可以看成是递归的。分发(dispatchTouchEvent)的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。
    ViewGroup的dispatchTouchEvent是真正在执行“分发”工作,它拥有boolean类型的返回值,当返回为true时,顺序下发会中断。而View的dispatchTouchEvent方法,并不执行分发工作,或者说它分发的对象就是自己,决定是否把touch事件交给自己处理,而处理的方法,便是onTouchEvent事件,事实上子View的dispatchTouchEvent方法真正执行的代码是这样的

   public boolean dispatchTouchEvent(MotionEvent ev){
        ....//其他处理,在此不管
        return onTouchEvent(event);
    }

所以对于View,我们 更关心它的onTouchEvent,而不会去认为的设置View的dispatchTouchEvent返回true,我们可以通过在onTouchEvent消费事件的方式来阻止事件的进一步下发。

5.ViewGroup在dispatchTouchEvent后,还会经历一个onInterceptTouchEvent方法,假如我们在某个ViewGroup的onInterceptTouchEvent中,将Action为Down的Touch事件返回true,那便表示将该ViewGroup的所有下发操作拦截掉。

我们编程过程中,对于ViewGroup,事件来说,我们更多的是关注他的事件分发过程,如果在dispatchTouchEvent过程,或是onInterceptTouchEvent返回值为true,代表事件被拦截了,不在下发,只有其自身和其父亲组件有权利消费该事件。这时候,我们就更关心其onTouchEvent事件对Touch的处理了。
对于View来说,我们更关心的是它的onTouchEvent方法,因为其dispatchTouchEvent方法,实际上也是执行了onTouchEvent方法。我们可以通过onTouchEvent来控制View是否消费事件,从而达到控件事件是否继续分发。ps:事件被消费了后,就不会分发了。

你可能感兴趣的:(Touch事件分发理解)