Android View事件传递图解

本文借鉴了图解Android View的事件传递中关于事件分发的分析并在其基础上做了补充(主要是本文中的第1中情况)和排版优化。

Android中的View事件(MotionEvent)的传递流程是开发自定义View的基础,如果不了解Android MotionEvent的传递过程,那在开发自定义View的过程中你肯定会遇到很多的困难。MotionEvent是由底层硬件检测并捕获后由系统生成随后被派发到了Activity,Activity再将事件派发到View树,然后事件沿着View树的节点流动或被消耗,这就是Android中MotionEvent从诞生-->传递-->消耗的一个大体流程,其中的细节不在本教程的讨论范围内,我们主要关心的是MotionEvent从Activity开始的这一段旅程,这其中有很多容易忽视的细节,这里我使用图表的形式对每一种情况进行分析说明,如有遗漏或错误请在评论区留言我会补充和改正。

本教程中没有明确标明返回值的地方为系统默认返回值

1. ViewGroup拦截并消耗事件

ViewGroup拦截并消耗事件

2. ViewGroup拦截不消耗事件

ViewGroup拦截不消耗事件

3. 叶子View消耗事件

叶子View消耗事件

4. ViewGroup不拦截但是消耗事件

ViewGroup不拦截消耗事件

5. View树不消耗事件

View树不消耗事件

总结

MotionEvent最终会被返回trueonTouchEvent方法消耗,除ACTION_DOWN事件外其他的事件不会通过各个节点的onTouchEvent方法传递,也就是说后续的ACTION_MOVEACTION_UP事件只会有一个节点的onTouchEvent方法收到。

注意:dispatchTouchEvent 方法在重载的时候一定要注意调用super.dispatchTouchEvent否则事件不会继续分发

参考:图解Android View的事件传递

你可能感兴趣的:(Android View事件传递图解)