Android事件分发mFirstTouchTarget的思考
1.ViewGroup
1)dispatchTouchEvent
如果决定拦截
那么会回调super.dispatch,即是把自己当作View来处理事件。
问题1.如果viewgroupe 拦截了事件,子view还能接收到事件吗?
思考:上面的代码里面如果拦截了不会去遍历子view触发子view的dispatch事件,而是会遍历mFirstTouchTarget,而mFirstTouchTarget是在没有拦截的时候遍历子view赋值的,所以如果Down事件拦截了,那么mFirstTouchTarget== null,就会把自身作为View来处理,并且将结果返回
问题2.如果某个ViewGroupe拦截了事件,并且onTouchEvent返回了false,那么事件还会继续传递给其他兄弟ViewGroup吗?
思考:ViewGroup如果存在兄弟节点,一定存在父节点,父节点没有拦截事件而是遍历子节点分发事件,如果其中的一个子节点(不论是view还是ViewGroup)没有消费事件,那么肯定是会继续遍历分发的
问题3.onTouchEvent 的ActionDown 如果返回了false,那么这个View将不再会接收到后续的MOVE、UP事件。onTouchEvent 的返回值 和dispatchTouchEvent的返回值有什么关联?
DOWN事件下发时,只要有一个子节点返回了true,就会跳出遍历循环,并且将子view添加到mFirstTouchTarget
返回true
如果DOWN事件返回false,那么将不会把这个view添加到mFirstTouchTarget里面,MOVE 、UP等事件分发时,只会分发给mFirstTouchTarget 链表里面记录的view。如果DOWN事件返回true 其他事件返回false,那么事件会返回到Activity
ViewGroupe dispatchTouchEvent的返回值跟view 的dispatchTouchEvent 相关,view 的dispatchTouchEvent 与ontouchListener、clickable 相关
问题4.只要DOWN事件返回true 遍历就会结束,那mFirstTouchTarget 应该就只有一个元素,为什么还要用一个链表?
思考:除了DOWN事件可以添加View到mFirstTouchTarget链表,多点触碰时
上面另外两个事件也可以将view添加到 mFirstTouchTarget
总结:事件分发每次总结总会发现新的知识,mFirstTouchTarget (链表)才是整个事件分发的核心