利用面向对象来讲解事件分发与上传

首先先来看下基本的套路,第一次看完事件分发后通常是懵逼,但我觉得还是应该先看下。

Android 中当系统捕获事件时,都是由最外层的View依次向下传递,当然,事件不能总是传递到最后一子View才结束,我们在每一级消息传递时都会对消息做出响应以决定继续分发或者拦截。

Touch事件相关方法 方法功能 View ViewGroup Activity
dispatchTouchEvent 事件调度 o
onInterceptTouchEvent 事件拦截 × ×
onTouchEvent 事件响应


Tips

  1. 表格中的View指的是不包含任何子ViewView,例如TextViewButton
  2. View本身是有dispatchTouchEvent方法的,但是由于没有子View,也就没有可分发的目标了
  3. 下文中提到的事件消费,均表示事件终结,及在这之后,既不会发送分发,也不会上传

事件调度 dispatchTouchEvent

return true; 事件已被消费,事件结束。
retrun false; 事件不再继续分发,呼叫上层控件对其进行消费。
return super.dispatchTouchEvent(ev); 事件分发,将被传递到onInterceptTouchEvent进行处理,(如果是Activity,则直接向下传递)

Tips
事件分发本身也对事件进行消费

事件拦截 onInterceptTouchEvent

此方法只在ViewGroup中存在
return true; 对事件进行拦截,并交由本层控件的onTouchEvent对事件进行处理
retrun false; 不对事件进行拦截,向下分发,传递给子ViewdispatchTouchEvent处理
return super.onInterceptTouchEvent(ev); 默认等同于 return true; (既然是拦截器,默认功能当然是拦截啦)

事件响应 onTouchEvent

return true; 事件已被消费,事件终结
return false; 事件处理后又上传到上层View,交由上层的ViewonTouchEvent进行处理
return super.onTouchEvent(ev); 默认等同于 return false;

ViewGroup 事件流程图

由于ViewGroup的事件是最全面的,所以图中只画了ViewGroup
Flow

Thanks
Android 事件分发机制详解 (这网址现在已经不能用了,心好累)
Processon 免费在线绘图

===

Note
中发现Activity 默认只会将Down向下传递,而MoveUp会在onTouchEvent中消费,必须要将Down消费后,MoveUp才会向下传递

正文

创建对象

  • 老板 Activity
    1. 主要是派发任务,也就是dispatchTouchEvent
    2. 秘书 onTouchEvent(老板总不能所有事都亲历亲为,所以我们还得有个秘书)
  • 管理 ViewGroup
    1. 项目经理 dispatchTouchEvent 也是派发任务
    2. 部门经理 onInterceptTouchEvent 用于评估项目经理提出的功能可行性及工时
    3. 技术经理 onTouchEvent 公司技术骨干,有难度的活找他们。
  • 码农 View
    1. onTouchEvent 由于码农是在公司的最低层,所以咱们没得选
    2. dispatchTouchEvent 虽然这方法咱现在没用,但咱也总不能当一辈子码农啊

明确功能

  • dispatchTouchEvent
    1. return true 对应角色自己就将任务完成了
    2. return false 对应角色自己无法下决定,于是请求上级出面解决
    3. return dispatchTouchEvent 任务正常派发
  • onInterceptTouchEvent
    1. return true/onInterceptTouchEvent 对应角色认为任务不合理,将其驳回
    2. return false 任务合理,不驳回
  • onTouchEvent
    1. return true 任务执行完成,但没必要汇报上级
    2. return false/super.onTouchEvent 本职工作已完成,但你自己并不能决定任务是否已经完成,需要上级验收通过才算真正完成

案例1

某天一位潜在客户来找到老板,说希望实现一个淘宝,预算5W,老板一听,虎躯一震,直接回绝客户,然后就没有下文了。

在这个案例中,老板自己就事情给处理了。

1
Activity/老板 dispatchTouchEvent return true.

案例2

  1. 某天一位潜在客户来找到老板,说希望实现一个淘宝,预算5000W,但是要1个月必须上线第一版,老板一听,时间紧了点,但加加班还是可以搞定的,很快便签好了合同,并将任务派发给了项目经理并特别要求这个项目一定要做好,
  2. 项目经理立马就将老板的指示传递给了部门经理
  3. 部分经理并没有提出异议,于是便将任务细化,派发给码农
  4. 码农表示自己一个月时间肯定做不完啊,于是便向技术经理需求帮助
  5. 一个月后,技术经理将第一版交到了老板的秘书手里
  6. 秘书将第一版拿给了老板,并且最终通过了客户验收
1
2
3
4
5
6
Activity/老板 dispatchTouchEvent return dispatchTouchEvent.
ViewGroup/项目经理 dispatchTouchEvent return dispatchTouchEvent.
ViewGroup/部门经理 onInterceptTouchEvent return false.
View/码农 onTouchEvent return false.
ViewGroup/技术经理 onTouchEvent return false
Activity/老板秘书 onTouchEvent

案例3

  1. 案例2中的客户想老板反映,希望网站的平均并发量可以达到100000/s,老板变将这个任务交给了项目项目经理
  2. 项目经理由于对技术不是很熟悉,于是便直接将任务交给部门经理评估
  3. 部门经理收到任务后,认为此需求不合理,找到老板秘书后表示阿里双11的峰值瞬时并发量也不过50000/s
  4. 老板秘书向老板传到了部门经理的意见
1
2
3
4
Activity/老板 dispatchTouchEvent return dispatchTouchEvent.
ViewGroup/项目经理 dispatchTouchEvent return dispatchTouchEvent.
ViewGroup/部门经理 onInterceptTouchEvent return true/onInterceptTouchEvent.
Activity/老板秘书 onTouchEvent