本文借鉴了图解Android View的事件传递中关于事件分发的分析并在其基础上做了补充(主要是本文中的第1中情况)和排版优化。
Android中的View
事件(MotionEvent
)的传递流程是开发自定义View的基础,如果不了解Android MotionEvent
的传递过程,那在开发自定义View
的过程中你肯定会遇到很多的困难。MotionEvent是由底层硬件检测并捕获后由系统生成随后被派发到了Activity,Activity再将事件派发到View树,然后事件沿着View树的节点流动或被消耗,这就是Android中MotionEven
t从诞生-->传递-->消耗的一个大体流程,其中的细节不在本教程的讨论范围内,我们主要关心的是MotionEvent
从Activity开始的这一段旅程,这其中有很多容易忽视的细节,这里我使用图表的形式对每一种情况进行分析说明,如有遗漏或错误请在评论区留言我会补充和改正。
本教程中没有明确标明返回值的地方为系统默认返回值
1. ViewGroup拦截并消耗事件
2. ViewGroup拦截不消耗事件
3. 叶子View消耗事件
4. ViewGroup不拦截但是消耗事件
5. View树不消耗事件
总结
MotionEvent
最终会被返回true
的 onTouchEvent
方法消耗,除ACTION_DOWN
事件外其他的事件不会通过各个节点的onTouchEvent
方法传递,也就是说后续的ACTION_MOVE
和ACTION_UP
事件只会有一个节点的onTouchEvent
方法收到。
注意:
dispatchTouchEvent
方法在重载的时候一定要注意调用super.dispatchTouchEvent
否则事件不会继续分发