前几篇文章我们从源码的层面分析了事件分发机制...不过感受有些时候仍是须要记一些笔记般的内容,简单快捷的回忆对应的内容。布局
布局嵌套层级:ViewGroupA中嵌套ViewGroupB,而后ViewGroupB嵌套ViewGroupC,ViewGroupC中包含ViewD。学习
基于此,我们分状况记录一些状况:spa
1、C的onInterceptTouchEvent()返回true,onTouchEvent()返回false3d
现象: DOWN走到C的onTouchEvent()
,而后逐层回调父View的onTouchEvent()
,而且后续MOVE、UP将再也不回调。 code
解读: DOWN一路下来,由于没有任何onTouchEvent()
返回true,那么意味着这条分发链上没有任何View消费事件,也就意味着mFirstTouchTarget
为null,所以后续的MOVE、UP事件就不会再从新分发。cdn
2、C的onInterceptTouchEvent()返回false,onTouchEvent()返回trueblog
现象: DOWN一直传到D,而后调D的onTouchEvent()
,C的onTouchEvent()
。找到消费事件的C,后续事件正常按ABC的顺序调用事件
解读: 由于不存在任何View拦截,因此事件会一直传递至D。而后逐层倒序回调onTouchEvent()
来肯定是否有子View消费。而此时咱们的C返回了true,因此着mFirstTouchTarget
不为null,后续事件就交由C去消费。开发
3、C的dispatchTouchEvent()直接返回true,且不主动调用superget
现象: 正常回调AB、但永远只会回调C的dispatchTouchEvent()
解读: 父View经过子View的dispatchTouchEvent()
的返回值来决定分发权。一旦返回true,意味着找到了消费此事件的View。由于咱们直接返回了true,因此这个对于父View来讲mFirstTouchTarget
已经确认。后续事件直接分发到此View。
可是由于咱们咱们直接true,且不掉super那意味着onTouchEvent()
没有时机执行...
固然可能会有小伙伴说,还有一些状况呢?但其实万变不离其宗,你都会唱、跳、RAP了还差打篮球吗?j你太美就哦了。