android 事件传递机制

布局为:<viewgroupA

            ViewGroupB

                  MyView>

没有截断时:


因为没有消费事件,所以后续的action_up和action_move都不会处理。


ViewGroupB 截断:


viewgroupB截断且消费了:


注意后续的action down和action move事件并不会执行 MyViewGroupB的onInterceptTouchEvent


viewgroupB截断不消费,viewgroupA消费:则后续的action move 和action up直接传给MyViewGroupA,谁消费了,后续的事件就直接传给他了


viewgroupB截断,但是viewgroupA和viewgroupB都没有消费事件,最终会在activity中ontouchevent中处理事件



结论:

1、事件从 Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的 View(ViewGroup)开始一直往下(子 View)传递。子 View 可以通过 onTouchEvent()对事件进行处理。

2、事件由父 View(ViewGroup)传递给子 View,ViewGroup 可以通过 onInterceptTouchEvent()对事件做拦截,停止其往下传递。

3、三个方法执行顺序dispatchTouchEvent ->  onInterceptTouchEvent  -> onTouchEvent

4、只要该控件消费了事件,后续的Action move 和up都会直接传到该控件的ontouchevent(反之不会),此时会执行该控件的dispatchTouchEvent 和onTouchEvent,onInterceptTouchEvent 不会被执行

5、如果没有一个控件消费事件,事件最终会在activity中被消费


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值