Android View事件传递机制(一)
需要明确的事情
- 用户的一次点击,会产生一个事件序列,也就是多次调用事件方法的函数。具体的说就是:一次
ACTION_DOWN
的事件、多个ACTION_MOVE
的事件、 一个ACTION_UP
的事件。 - 我们可以将传递过程分为两个部分,第一部分为 是否往分发事件的传递,其过程为:由父
view
向子view
传递(也就是dispatchTouchEvent
方法); 第二部分为 是否处理事件的传递,其过程为:由子view
向父view
传递(也就是onTouchEvent
)。onInterceptTouchEvent
方法决定了第一个传递过程到哪一层结束,同时,第二个传递也就相应从这一场开始。 ACTION_DOWN
的事件相当于首先去寻找处理该事件的view
,如果找到了,之后的事件会直接传递给该view
,否则,之后的事件直接由最外层的Activity
处理了。
具体的情形
注意,这里说的是down
的事件。
- 如果
View
或ViewGroup
在dispatchTouchEvent
返回true
,那么该事件的传递结束,并且之后的事件序列都会只调用到该dispatchTouchEvent
方法,然后结束。(不会再调用自己的onInterceptTouchEvent
和onTouchEvent
方法了。) - 如果
View
或ViewGroup
在onInterceptTouchEvent
返回true
,那么会调用自己的onTouchEvent
方法,并且继续向上传递,调用父view
的onTouchEvent
,直到找到一个onTouchEvent
返回为true
时停止。之后的事件就会直接传到这个onTouchEvent
方法中。(之注意,之后的事件不会再调用到onInterceptTouchEvent
方法)。 - 如果
View
或ViewGroup
在onTouchEvent
返回true
,是否处理事件的传递就会到此结束,不会再想起父view
传递,而且之后的事件序列也就直接传到该view的onTouchEvent
方法。
以上,就是view 的事件传递的宏观上的描述。可能描述的不够清楚,如果有兴趣的话,最好自己写个demo,简单的修改返回值,来进行相应的测试。只有知道了其宏观表现,对于继续深入研究时,才不会盲目不知所措。
在这一部分,主要是参考了《Android 群英会》和《Android开发艺术探索》。
以上是自己简单总结,之后会结合源码在进一步分析。