-
Touch事件分发中只有两个主角:ViewGroup和View。
ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。
View包含dispatchTouchEvent、onTouchEvent两个相关事件。 -
ViewGroup和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup。
-
触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。
-
当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:事件被消费了后,就不会分发了。
网友评论