Android 事件分发流程30分钟掌握

touch事件:

touch事件分发只有两个主角:

ViewGroup 和View。Activity 的Touch事件实际上是调用ViewGroup的Touch事件,可以直接当成ViewGroup处理。
ViewGroup的相关事件有三个:onInterceptTouchEvent ,dispatchTouchEvent,onTouchEvent
View的相关事件有两个:dispachTouchEvent,onTouchEvent
1.Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。
2.ViewGroup和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup。
3.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。
4.当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。
5.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:如ViewGroup0-ViewGroup1-TextView的结构中,TextView返回了true,它将被保存在ViewGroup1中,而ViewGroup1也会返回true,被保存在ViewGroup0中。当Move和UP事件来时,会先从ViewGroup0传递至ViewGroup1,再由ViewGroup1传递至TextView。
6.当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触发Acitivity的onTouchEvent方法。
7.onInterceptTouchEvent有两个作用:1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。

在这里插入图片描述
在这里插入图片描述

对照上图能读懂以下log,基本上了解了事件的传递流程

ViewGroupA - ViewGroupB - View (默认返回false)

我们先不修改任何返回值,只是点击一下View,然后看Log会怎样记录我们的操作和程序响应。点击View后log:

01-06 10:01:11.807 30119 30119 D TestEvent: ViewGroupA dispatchTouchEvent :ACTION_DOWN
01-06 10:01:11.807 30119 30119 D TestEvent: ViewGroupA onInterceptTouchEvent :ACTION_DOWN
01-06 10:01:11.807 30119 30119 D TestEvent: ViewGroupB dispatchTouchEvent :ACTION_DOWN
01-06 10:01:11.807 30119 30119 D TestEvent: ViewGroupB onInterceptTouchEvent :ACTION_DOWN
01-06 10:01:11.807 30119 30119 D TestEvent: View dispatchTouchEvent :ACTION_DOWN
01-06 10:01:11.808 30119 30119 D TestEvent: View onTouchEvent :ACTION_DOWN
01-06 10:01:11.808 30119 30119 D TestEvent: ViewGroupB onTouchEvent :ACTION_DOWN
01-06 10:01:11.809 30119 30119 D TestEvent: ViewGroupA onTouchEvent :ACTION_DOWN

返回值都为false
默认不处理:
ViewGroupA dispatchTouchEvent - >onInterceptTouchEvent ->ViewGroupB dispatchTouchEvent ->onInterceptTouchEvent ->View dispatchTouchEvent ->onTouchEvent (View dispatchTouchEvent向上)–>onTouchEvent (ViewGroupB dispatchTouchEvent向上)–>onTouchEvent (ViewGroupA)

ViewGroupA ()onInterceptTouchEvent()方法返回true: 直接返回给了ViewGroupA 的onTouchEvent直接处理了事件 如果viewGroupA 的onTouchEvent 返回true 则事件处理掉,如果false 则不处理事件

01-06 10:18:29.824 31192 31192 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_DOWN
01-06 10:18:29.824 31192 31192 D TestEvent: ViewGroupA onInterceptTouchEvent :true:ACTION_DOWN
01-06 10:18:29.824 31192 31192 D TestEvent: ViewGroupA onTouchEvent ::ACTION_DOWN

ViewGroupB ()onInterceptTouchEvent()方法返回true: 事件直接到viewGropB 的onTouchEvent 如果(viewGropB onTouchEvent)返回false,则分发给ViewGropA 的onTouchEvent

01-06 10:20:18.518 31338 31338 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_DOWN
01-06 10:20:18.518 31338 31338 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_DOWN
01-06 10:20:18.518 31338 31338 D TestEvent: ViewGroupB dispatchTouchEvent ::ACTION_DOWN
01-06 10:20:18.518 31338 31338 D TestEvent: ViewGroupB onInterceptTouchEvent :true:ACTION_DOWN
01-06 10:20:18.518 31338 31338 D TestEvent: ViewGroupB onTouchEvent ::ACTION_DOWN
01-06 10:20:18.519 31338 31338 D TestEvent: ViewGroupA onTouchEvent ::ACTION_DOWN

ViewGroupA onTouchEvent() 返回true :

01-06 10:26:01.576 31732 31732 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_DOWN
01-06 10:26:01.576 31732 31732 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_DOWN
01-06 10:26:01.576 31732 31732 D TestEvent: ViewGroupB dispatchTouchEvent ::ACTION_DOWN
01-06 10:26:01.576 31732 31732 D TestEvent: ViewGroupB onInterceptTouchEvent ::ACTION_DOWN
01-06 10:26:01.577 31732 31732 D TestEvent: View dispatchTouchEvent ::ACTION_DOWN
01-06 10:26:01.577 31732 31732 D TestEvent: View onTouchEvent ::ACTION_DOWN
01-06 10:26:01.578 31732 31732 D TestEvent: ViewGroupB onTouchEvent ::ACTION_DOWN
01-06 10:26:01.578 31732 31732 D TestEvent: ViewGroupA onTouchEvent :true:ACTION_DOWN

01-06 10:26:01.660 31732 31732 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_UP
01-06 10:26:01.660 31732 31732 D TestEvent: ViewGroupA onTouchEvent :true:ACTION_UP

ViewGroupB onTouchEvent() 返回true : 事件到ViewGroupB onTouchEVent 事件就不传递了。

01-06 10:29:10.538 31931 31931 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_DOWN
01-06 10:29:10.538 31931 31931 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_DOWN
01-06 10:29:10.539 31931 31931 D TestEvent: ViewGroupB dispatchTouchEvent ::ACTION_DOWN
01-06 10:29:10.539 31931 31931 D TestEvent: ViewGroupB onInterceptTouchEvent ::ACTION_DOWN
01-06 10:29:10.539 31931 31931 D TestEvent: View dispatchTouchEvent ::ACTION_DOWN
01-06 10:29:10.539 31931 31931 D TestEvent: View onTouchEvent ::ACTION_DOWN
01-06 10:29:10.540 31931 31931 D TestEvent: ViewGroupB onTouchEvent :true:ACTION_DOWN

01-06 10:29:10.632 31931 31931 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_UP
01-06 10:29:10.632 31931 31931 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_UP
01-06 10:29:10.632 31931 31931 D TestEvent: ViewGroupB dispatchTouchEvent ::ACTION_UP
01-06 10:29:10.632 31931 31931 D TestEvent: ViewGroupB onTouchEvent :true:ACTION_UP

在看一下ViewGroupA 中分发事件(dispatchTouchEvent)返回true 的结果:

01-06 10:31:37.876 32111 32111 D TestEvent: ViewGroupA dispatchTouchEvent :true:ACTION_DOWN

01-06 10:31:38.063 32111 32111 D TestEvent: ViewGroupA dispatchTouchEvent :true:ACTION_UP

所有事件都被拦截

在看一下ViewGroupB 中分发事件(dispatchTouchEvent)返回true 的结果:

01-06 10:32:42.881 32226 32226 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_DOWN
01-06 10:32:42.881 32226 32226 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_DOWN
01-06 10:32:42.882 32226 32226 D TestEvent: ViewGroupB dispatchTouchEvent :true:ACTION_DOWN

01-06 10:32:42.956 32226 32226 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_UP
01-06 10:32:42.956 32226 32226 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_UP
01-06 10:32:42.956 32226 32226 D TestEvent: ViewGroupB dispatchTouchEvent :true:ACTION_UP

View 的onTouchEvent 返回true:

01-06 11:11:46.792  2387  2387 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_DOWN
01-06 11:11:46.793  2387  2387 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_DOWN
01-06 11:11:46.793  2387  2387 D TestEvent: ViewGroupB dispatchTouchEvent ::ACTION_DOWN
01-06 11:11:46.793  2387  2387 D TestEvent: ViewGroupB onInterceptTouchEvent ::ACTION_DOWN
01-06 11:11:46.793  2387  2387 D TestEvent: View dispatchTouchEvent ::ACTION_DOWN
01-06 11:11:46.793  2387  2387 D TestEvent: View onTouchEvent :true:ACTION_DOWN

01-06 11:11:46.906  2387  2387 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_UP
01-06 11:11:46.906  2387  2387 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_UP
01-06 11:11:46.906  2387  2387 D TestEvent: ViewGroupB dispatchTouchEvent ::ACTION_UP
01-06 11:11:46.906  2387  2387 D TestEvent: ViewGroupB onInterceptTouchEvent ::ACTION_UP
01-06 11:11:46.906  2387  2387 D TestEvent: View dispatchTouchEvent ::ACTION_UP
01-06 11:11:46.906  2387  2387 D TestEvent: View onTouchEvent :true:ACTION_UP

view 的dispatchTouchEvent 返回true:

01-06 11:13:03.685  2649  2649 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_DOWN
01-06 11:13:03.685  2649  2649 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_DOWN
01-06 11:13:03.685  2649  2649 D TestEvent: ViewGroupB dispatchTouchEvent ::ACTION_DOWN
01-06 11:13:03.685  2649  2649 D TestEvent: ViewGroupB onInterceptTouchEvent ::ACTION_DOWN
01-06 11:13:03.685  2649  2649 D TestEvent: View dispatchTouchEvent :true:ACTION_DOWN

01-06 11:13:03.726  2649  2649 D TestEvent: ViewGroupA dispatchTouchEvent ::ACTION_UP
01-06 11:13:03.727  2649  2649 D TestEvent: ViewGroupA onInterceptTouchEvent ::ACTION_UP
01-06 11:13:03.727  2649  2649 D TestEvent: ViewGroupB dispatchTouchEvent ::ACTION_UP
01-06 11:13:03.727  2649  2649 D TestEvent: ViewGroupB onInterceptTouchEvent ::ACTION_UP
01-06 11:13:03.727  2649  2649 D TestEvent: View dispatchTouchEvent :true:ACTION_UP
发布了83 篇原创文章 · 获赞 19 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_38148680/article/details/88954054
今日推荐