提问
1 手指1 2 3 4 依次按下 mFirstTouchTarget 结构是一个什么样情况
2 手指4 按下时,为啥手指 1 2 3 对应view接收不到事件分发了
安卓事件分发是基于多点触控
来分析下ViewGroup的成员变量mFirstTouchTarget
private TouchTarget mFirstTouchTarget; //First touch target in the linked list of touch targets.
TouchTarget是一个链表结构, 来解决多点触控问题
当手指点击到某view上,并成功处理down事件,那么会执行下面这个方法
addTouchTarget(child, idBitsToAssign); //mFirstTouchTarget被赋值
最开始 mFirstouchTarget =null
1 当手指1按下时候 , 创建 target1 target1.next=null mFirstouchTarget = target1
2 当手指2按下时候 , 创建 target2 target2.next= target1 mFirstouchTarget = target2
3 当手指3按下时候 , 创建 target3 target3.next= target2 mFirstouchTarget = target3
4 当手指4按下时候 , 因为没点到任何子view 所以不会创建 target mFirstouchTarget = target3
mFirstouchTarget = target3 →target2→target1→null 链表结构
在回过头来看看mFirstouchTarget注释: First touch target in the linked list of touch targets
官方说mFirstouchTarget 是 targets链表集合的第一个target 哦 对滴
到此问题1解决
图1-1中手指4按下不动
mFirstTouchTarget = null
接着手指1按下 viewgroup 接收到 ACTION_POINTER_DOWN事件
根据图1-4逻辑发现始终被viewgroup拦截
所以 在viewgroup中第一次的down事件没有点到子view,点到group并且不动, 后续子view就不会接收到任何事件了
在这个过程还有一个 局部变量 TouchTarget newTouchTarget 也是很重要的需理解