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 (链表)才是整个事件分发的核心

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值