1. 事件分发的起始
a. Activity的dispatchTouchEvent开始
b. PhoneWindow的superDispatchTouchEvent
c. DecorView的dispatchTouchEvent
d. ViewGroup的dispatchTouchEvent
从之前的setContent流程可以知道,我们自己的view被加到了DecorView的子View(ContentView)中。
所以事件会按照ViewGroup分发流程给到我们自己的View
2. ViewGroup的事件分发
a. 判断事件是否应该被处理 onFilterTouchEventForSecurity,正常情况下都会处理。
b. 如果是down事件,重置。因为down事件是所有事件流的开始。
c. 判断是否要拦截事件
- 如果是down事件,或者之前有子View处理过事件(代码中用mFirstTouchTarget != null 表示有子View处理了此事件流)
- 判断子View有没有FLAG_DISALLOW_INTERCEPT,如果有不拦截
- 再判断自身的onInterceptTouchEvent方法,如果有返回false,也不拦截
- 如果不是down事件,同时子View没有处理过事件,直接拦截
这就意味着,如果子View不在down事件的时候进行的时候进行处理的话,后续就没有机会在处理了。
d. 判断是否cancel
e. 当非canel,同时也不拦截的时候
- down事件,即事件流开始时,会去寻找适合的View,询问是否要处理。
- 这里是通过 dispatchTransformedTouchEvent 来找的,会调用到子View的dispatchTouchEvent方法做判断,如果返回true,就说明事件被该子View消费了
- 如果有子View处理,就给mFirstTouchTarget赋值
f. 事件处理
- mFirstTouchTarget 为空, 说明没有子View处理事件,通过dispatchTransformedTouchEvent处理
- 最后会调用super.dispatchTouchEvent处理事件
- ViewGroup的super就是View,所以这里看要View的dispatchTouchEvent
- 里面有很多操作,主流程是调用onTouchEvent去处理事件。
- 如onTouchEvent消费了此事件,就会返回true;反之,返回false
- mFirstTouchTarget 不空, 直接交给TouchTarget处理
- 同样是通过dispatchTransformedTouchEvent进行的处理,不过这里参数child不为空
- 会调用到TouchTarget对应的子View的dispatchTouchEvent
- 这里还会判断事件是否被Viewgroup拦截了,如果被拦截了,就给TouchTarget对应的子View发一个cancel事件
Android 事件分发 笔记
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 很高兴遇见你~ 本文是事件分发系列的第三篇。 在前两篇文章中,Android事件分发机制一:事件是如何到达a...
- 在理解事件分发机制之前,我们先要明白,事件分发机制是为View服务的,而View是Android中所有控件的基类,...
- 本篇文章主要结合面试中的问题,从以下几个方面分析Android事件分发,为方便理解,源码分析尽量点到为止,避免深入...
- 作者:Carson_Ho 链接:https://www.jianshu.com/p/38015afcdb58 来源...