事件的分发、拦截、与消费机制

1、核心方法

dispatchTouchEvent(MotionEvent ev) // 分发
onInterceptTouchEvent(MotionEvent ev) // 拦截
onTouchEvent(MotionEvent event) // 消费
requestDisallowInterceptTouchEvent // 是否允许父控件拦截,也算一个吧

2、直接从ViewGroup分发开始

事件 1个ACTIVO_DOWN N个ACTION_MOVE 1个ACTION_UP 或 ACTION_CANCER

所有事件序列都是从DOWN事件开始 ,故有DOWN事件时会初始化控件状态

3、决定当前控件是否拦截事件

4、DOWN事件时决定分发链

从最上端遍历查找目标view,是因为两个view有可能重叠,所以选择重叠控件的最上层开始判断

 

这个地方如果拦截标识为true,child == null 故执行View的事件分发(view的事件分发比较简单,不过很重要,看完后就会明白touch、longClick、onClick的执行顺序),如果不拦截且是ViewGroup就会继续分发,有没有感觉和责任链模式很像,这里如果所有子控件的onTouchEvent方法返回false就会执行下图,child == null 逻辑

 

如果MOVE事件到来,对拦截标识赋值后直接进入了

从上面两张图,如果MOVE的时候拦截,则子控件的事件类型会变成CANCEL,切从分发链中移除,后续子控件不在收到分发事件,事件的消费交给了原子控件的父控件处理

如果不拦截,最终消费事件的方法返回了false则直接交给了处理,如下图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值