安卓的事件传递机制,是由Activity分发->ViewGroup分发->ViewGroup拦截->View分发->View响应,然后在逐级回退,如果中间有操作,则会提前消费或者回退,先看一下流程图。
下面结合源码来说明这张图。
首先由Activity的dispatchTouchEvent开始,
,
可以看到Activity的onTouchEvent触不触发完全由getWindow的superDispatchTouchEvent决定,如果返回true,走到if里retrun掉,下面就不能响应了。
getWindow的superDispatchTouchEvent又是个什么东东呢,点进去看是个抽象方法,我们知道,window的唯一实现类是PhoneWindow,而PhoneWindow的源码如下:
这个mDecor是个什么呢,没错,就是activity的view显示的最外层。实际上Activity的层级是由Activity->Window->DecorView这个再布局文件添加的view都会添加到它上面,其本身是个继承自FrameLayout,属于ViewGroup,superDispatchTouchEvent即调用ViewGroup的dispatchTouchEvent,这个的dispatch里是如何分发的呢?
如果拦截自己消费,如果没拦截,子View分发,如果没有子view,自己消费。
下面看view的事件分发,可以看到view是否执行onTouchEvent取决于上面的,事件是否过滤,ontouchListener是否为空,ontouch事件的返回值,是否可点击。
1.即如果设置了onTouchListener且回调事件为true,那下面的onTouch也不会执行。
2.如果onTouchEvent返回真,则分发返回真,事件结束。
3.如果返回false,则分发返回false,ViewGroup响应onTouch。