Android touch事件传递机制:
我们可以看看android源代码:
Activity.java中
暂且不管onUserInteraction方法因为它只是一个空方法如果你没实现的话。getWindow().superDispatchTouchEvent(ev)。其中getWindow()返回的是PhoneWindow。
PhoneWindow.java:
此函数调用super.dispatchTouchEvent(event),Activity的rootview是PhoneWindow.DecorView,它继承FrameLayout。通过super.dispatchTouchEvent把touch事件派发给各个Activity的是子view。同时我可以看到,如果子view拦截了事件,则不会执行onTouchEvent函数。
ViewGroup.java中dispatchTouchEvent方法:
由于代码过长这里就不贴出来了,但也知道它返回的是
return target.dispatchTouchEvent(ev);
这里target指的是所分发的目标,可以是它本身,也可以是它的子View。
ViewGroup.java中的onInterceptTouchEvent方法:
默认情况下返回false。即不拦截touch事件。
View.java中的dispatchTouchEvent方法
这里我们很清楚可以知道如果if条件不成立则dispatchTouchEvent的返回值是onTouchEvent的返回值
View.java中的onTouchEvent方法
所以很容易得到触摸事件默认处理流程(以ACTION_DOWN事件为例):
当触摸事件ACTION_DOWN发生之后,先调用Activity中的dispatchTouchEvent函数进行处理,紧接着ACTION_DOWN事件传递给ViewG