在事件分发的时候,最外层的ViewGroup首先调用dispatchTouchEvent()方法,然后再执行onInterceptTouchEvent()方法,而View是没有onInterceptTouchEvent()的方法的,在传递的时候,如果这些方法返回的是false,则表示不拦截,事件会下面传递。我们在覆写这些方法的时候,不作处理,默认返回时false,所以我们可以看到事件传递到了ViewTest的dispatchTouchEvent(),但注意dispatchTouchEvent()与onInterceptTouchEvent()的区别,如果事件传递到了这个View,则dispatchTouchEvent()方法一定会调用,而onInterceptTouchEvent()方法则在dispatchTouchEvent()内部调用,表示是否拦截事件,所以当我们需要拦截的时候一般改写onInterceptTouchEvent()
在事件处理的时候,则是从分发到了最底层的View开始向上处理,在onTouchEvent(),返回了true,则表示这个View已经处理了 ,不必在向上传递,但我们覆写这些方法的时候,不作处理,默认返回时false,所以继续向上传递,到了最上层的ViewGroup中。这就是我们验证的结果。
这种结果我们可以用现实中的例子来解释,这个例子是网上看到了,很生动形象。我们把整个事件传递的View看成是一个公司,ViewGroupA是一个总经理,ViewGroupB是一个部长,ViewTest是一个员工。现在来了一个任务,总经理觉得不需要自己处理,返回了false,就传递给了下一层部长,部长看了也觉得不需要处理,继续返回false,传递给了底层员工,员工做了做,发现太难了,处理不了,就返回了false,然后上层部长接手,发现确实很难,也处理不了,继续返回false,传递给了总经理。整个事件分发处理就结束了。
现在,又来了一个新任务,我们总经理有了前车之鉴,决定自己处理这件事,不在交给下面的人做,因为给了他们,他们也处理不好,所以他决定自己拦截这个事件,于是在ViewGroupA中的onInterceptTouchEvent()中返回true,查看效果
确实如我们之前所说的,是这样一个处理流程,ViewGroupA自己弄完了所有事情,随着事件的变多,总经理终于累倒了,于是他决定把事情分给部长,自己只处理部长处理不了的,于是我们总经理不拦截事件,而是部长拦截事件,我们看看效果
08-30 08:59:27.702 23810-23810/com.byhieg.viewdipatch E/ViewGroupA: ViewGroupA dispatchTouchEvent0 08-30 08:59:27.702 23810-23810/com.byhieg.viewdipatch E/ViewGroupA: ViewGroupA onInterceptTouchEvent0 08-30 08:59:27.702 23810-23810/com.byhieg.viewdipatch E/ViewGroupB: ViewGroupB dispatchTouchEvent0 08-30 08:59:27.702 23810-23810/com.byhieg.viewdipatch E/ViewGroupB: ViewGroupB onInterceptTouchEvent0 08-30 08:59:27.702 23810-23810/com.byhieg.viewdipatch E/ViewGroupB: ViewGroupB onTouchEvent0 08-30 08:59:27.702 23810-23810/com.byhieg.viewdipatch E/ViewGroupA: ViewGroupA onTouchEvent0