当一个MotionEvent产生以后,系统需要把这个事件传递给一个具体的View,这个传递过程就是分发过程,事件分发的过程是由
dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent这三个方法过程完成。
dispatchTouchEvent:事件分发。
return true:表示事件被以该节点为根节点的View树成功处理,事件不会再向上返还。
return false:表示以该节点为根节点的View数,没有一个View处理此事件,所以事件向上返还给View的父节点。
onInterceptTouchEvent:事件拦截。
return true:当前ViewGroup自己处理该事件,不再传递给其child。
return false:当前ViewGroup不拦截该事件,事件传递给其child。
onTouchEvent:事件消耗。
return true:该View成功处理了该事件,不再向上返还。
return false:该View没有处理该事件,它的父节点来处理。
当一个点击事件产生后,Activity的dispatchTouchEvent()方法会最先接收到点击事件,然后向下传递传递,如果向下传递后ViewGroup和View都不做任何处理,事件会最后回到Activity的onTouchEvent()方法处理。
以Activity->ViewGroup->View三个为例,讨论各种情况:
1)不做任何处理:
日志显示结果:
事件传递流程:
2)Activity的dispatchTouchEvent()方法返回true或false:
日志显示结果:
事件分发过程:
3)Activity的onTouchEvent()方法返回true或false:同1)
4)ViewGroup的DispatchTouchEvent()方法返回true:
日志显示结果:
事件分发过程:
5)ViewGroup的dispatchTouchEvent()方法返回false:
日志显示结果:
事件分发过程:
6)ViewGroup的onInterceptTouchEvent()方法返回true:
日志显示结果:
事件分发流程:
7)ViewGroup的onInterceptTouchEvent()方法返回false:同1)
8)ViewGroup的onTouchEvent()方法返回true:
日志显示结果:
事件分发过程:
9)ViewGroup的OnTouchEvent()方法返回false:同1)
10)View的dispatchTouchEvent()方法返回true:
日志显示结果:
事件分发过程:
11)View的dispatchTouchEvent()方法返回false:
日志显示结果:
事件分发过程:
12)View的onTouchEvent()方法返回true:
日志显示结果:
事件分发过程:
13)View的onTouchEvent方法返回false:同1)