首先先来看下基本的套路,第一次看完事件分发后通常是懵逼,但我觉得还是应该先看下。
Android 中当系统捕获事件时,都是由最外层的View
依次向下传递,当然,事件不能总是传递到最后一子View才结束,我们在每一级消息传递时都会对消息做出响应以决定继续分发或者拦截。
Touch事件相关方法 | 方法功能 | View | ViewGroup | Activity |
---|---|---|---|---|
dispatchTouchEvent | 事件调度 | × | √ | √ |
onInterceptTouchEvent | 事件拦截 | × | √ | × |
onTouchEvent | 事件响应 | √ | √ | √ |
Tips
1. 表格中的View
指的是不包含任何子View
的View
,例如TextView
、Button
2.View
本身是有dispatchTouchEvent
方法的,但是由于没有子View
,也就没有可分发的目标了
3. 下文中提到的事件消费,均表示事件终结,及在这之后,既不会发送分发,也不会上传
事件调度 dispatchTouchEvent
return true;
事件已被消费,事件结束。
retrun false;
事件不再继续分发,呼叫上层控件对其进行消费。
return super.dispatchTouchEvent(ev);
事件分发,将被传递到onInterceptTouchEvent
进行处理,(如果是Activity
,则直接向下传递)
Tips
事件分发本身也对事件进行消费
事件拦截 onInterceptTouchEvent
此方法只在ViewGroup中存在
return true;
对事件进行拦截,并交由本层控件的onTouchEvent
对事件进行处理
retrun false;
不对事件进行拦截,向下分发,传递给子View
的dispatchTouchEvent
处理
return super.onInterceptTouchEvent(ev);
默认等同于 return true;
(既然是拦截器,默认功能当然是拦截啦)
事件响应 onTouchEvent
return true;
事件已被消费,事件终结
return false;
事件处理后又上传到上层View
,交由上层的View
的onTouchEvent
进行处理
return super.onTouchEvent(ev);
默认等同于 return false;
ViewGroup 事件流程图
由于ViewGroup的事件是最全面的,所以图中只画了ViewGroup
Tips
Android 事件分发机制详解 (这网址现在已经不能用了,心好累)
===
Note
Activity
默认只会将Down向下传递,只有Down被消费后Move、Up才会向下传递
正文
创建对象
- 老板 Activity
- 主要是派发任务,也就是
dispatchTouchEvent
- 秘书
onTouchEvent
(老板总不能所有事都亲历亲为,所以我们还得有个秘书)
- 主要是派发任务,也就是
- 管理 ViewGroup
- 项目经理
dispatchTouchEvent
也是派发任务 - 部门经理
onInterceptTouchEvent
用于评估项目经理提出的功能可行性及工时 - 技术经理
onTouchEvent
公司技术骨干,有难度的活找他们。
- 项目经理
- 码农 View
- onTouchEvent 由于码农是在公司的最低层,所以咱们没得选
- dispatchTouchEvent 虽然这方法咱现在没用,但咱也总不能当一辈子码农啊
明确功能
- dispatchTouchEvent
return true
对应角色自己就将任务完成了return false
对应角色自己无法下决定,于是请求上级出面解决return dispatchTouchEvent
任务正常派发
- onInterceptTouchEvent
return true/onInterceptTouchEvent
对应角色认为任务不合理,将其驳回return false
任务合理,不驳回
- onTouchEvent
return true
任务执行完成,但没必要汇报上级return false/super.onTouchEvent
本职工作已完成,但你自己并不能决定任务是否已经完成,需要上级验收通过才算真正完成
案例1
某天一位潜在客户来找到老板,说希望实现一个淘宝,预算5W,老板一听,虎躯一震,直接回绝客户,然后就没有下文了。
在这个案例中,老板自己就事情给处理了。
Activity/老板 dispatchTouchEvent return true.
案例2
- 某天一位潜在客户来找到老板,说希望实现一个淘宝,预算5000W,但是要1个月必须上线第一版,老板一听,时间紧了点,但加加班还是可以搞定的,很快便签好了合同,并将任务派发给了项目经理并特别要求这个项目一定要做好,
- 项目经理立马就将老板的指示传递给了部门经理
- 部分经理并没有提出异议,于是便将任务细化,派发给码农
- 码农表示自己一个月时间肯定做不完啊,于是便向技术经理需求帮助
- 一个月后,技术经理将第一版交到了老板的秘书手里
- 秘书将第一版拿给了老板,并且最终通过了客户验收
Activity/老板 dispatchTouchEvent return dispatchTouchEvent.
ViewGroup/项目经理 dispatchTouchEvent return dispatchTouchEvent.
ViewGroup/部门经理 onInterceptTouchEvent return false.
View/码农 onTouchEvent return false.
ViewGroup/技术经理 onTouchEvent return false
Activity/老板秘书 onTouchEvent
案例3
- 案例2中的客户想老板反映,希望网站的平均并发量可以达到100000/s,老板变将这个任务交给了项目项目经理
- 项目经理由于对技术不是很熟悉,于是便直接将任务交给部门经理评估
- 部门经理收到任务后,认为此需求不合理,找到老板秘书后表示阿里双11的峰值瞬时并发量也不过50000/s
- 老板秘书向老板传到了部门经理的意见
Activity/老板 dispatchTouchEvent return dispatchTouchEvent.
ViewGroup/项目经理 dispatchTouchEvent return dispatchTouchEvent.
ViewGroup/部门经理 onInterceptTouchEvent return true/onInterceptTouchEvent.
Activity/老板秘书 onTouchEvent