Android 的事件分发机制主要是Touch 事件分发,有两个角:ViewGroup 和View。Activity 的Touch 事件事实上是调用它内部的ViewGroup 的Touch 事件,可以直接当成ViewGroup 处理。View 在ViewGroup 内,ViewGroup 也可以在其他ViewGroup 内,这时候把内部的ViewGroup 当成View 来分析。先分析ViewGroup 的处理流程:首先得有个结构模型概念:ViewGroup 和View 组成了一棵树形结构,最顶层为Activity 的ViewGroup,下面有若干的ViewGroup 节点,每个节点之下又有若干的ViewGroup 节点或者View节点,依次类推。如图:
Android 的事件分发机制_第1张图片

当一个Touch 事件(触摸事件为例)到达根节点,即Acitivty 的ViewGroup 时,它会依次下发,下发的过程是调用子View(ViewGroup)的dispatchTouchEvent 方法实现的。简单来说,就是ViewGroup 遍历它包含着的子View,调用每个View 的dispatchTouchEvent 方法, 而当子View 为ViewGroup 时, 又会通过调ViewGroup dispatchTouchEvent 方法继续调用其内部的View 的dispatchTouchEvent 方法。上述例子中的消息下发顺序是这样的:①-②-⑤-⑥-⑦-③-④dispatchTouchEvent 方法只负责事件的分发,它拥有boolean 类型的返回值,当返回为true 时,顺序下发会中断。在上述例子中如果⑤的dispatchTouchEvent 返回结果为true,那么⑥-⑦-③-④将都接收不到本次Touch 事件。
1.Touch 事件分发中只有两个主角:ViewGroup 和View 。ViewGroup 包含onInterceptTouchEvent 、dispatchTouchEvent、onTouchEvent 三个相关事件。View 包含dispatchTouchEvent、onTouchEvent 两个相关事件。其中ViewGroup 又继承于View。
2.ViewGroup 和View 组成了一个树状结构,根节点为Activity 内部包含的一个ViewGroup。
3.触摸事件由Action_Down、Action_Move、Aciton_UP 组成,其中一次完整的触摸事件中,Down 和Up 都只有一个,Move 有若干个,可以为0 个。
4.当Acitivty 接收到Touch 事件时,将遍历子View 进行Down 事件的分发。ViewGroup 的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View 会在onTouchuEvent 结果返回true。
5.当某个子View 返回true 时,会中止Down 事件的分发,同时在ViewGroup 中记录该子View。接下去的Move和Up 事件将由该子View 直接进行处理。由于子View 是保存在ViewGroup 中的,多层ViewGroup 的节点结构时,上级ViewGroup 保存的会是真实处理事件的View 所在的ViewGroup 对象:如ViewGroup0-ViewGroup1-TextView的结构中,TextView 返回了true,它将被保存在ViewGroup1 中,而ViewGroup1 也会返回true,被保存在ViewGroup0 中。当Move 和UP 事件来时,会先从ViewGroup0 传递至ViewGroup1,再由ViewGroup1 传递至TextView。
6.当ViewGroup 中所有子View 都不捕获Down 事件时,将触发ViewGroup 自身的onTouch 事件。触发的方式是调用super.dispatchTouchEvent 函数,即父类View 的dispatchTouchEvent 方法。在所有子View 都不处理的情况下,触发Acitivity 的onTouchEvent 方法。
7.onInterceptTouchEvent 有两个作用:1.拦截Down 事件的分发。2.中止Up 和Move 事件向目标View 传递,使得目标View 所在的ViewGroup 捕获Up 和Move 事件。

更多相关文章

  1. 知识梳理:Android子线程中更新UI的3种方法
  2. android中判断当前运行activity名的方法
  3. 葵花宝典之普及篇 —— HD2 android 各种直刷方法
  4. android中实现view的更新UI有两组方法的问题
  5. android的Touch事件解析(dispatchTouchEvent,onInterceptTouchEven
  6. android捕获js中的dialog事件
  7. Could not find SDK_Root\tools\adb.exe 的解决方法
  8. Android高手进阶教程(八)-------Android中两种设置全屏的方法!!!

随机推荐

  1. Android(安卓)Sensor框架简述(三)
  2. 和菜鸟一起学android4.0.3源码之SD卡U盘
  3. kotlin零基础入门(一) - kotlin的简单介绍
  4. Android文件储存
  5. restartPackage && sharedUserId="androi
  6. android4.4修改Recovery动画(包含恢复出厂
  7. BroadcastReceiver之实现锁屏、解锁例子
  8. 使用android SharedPreference判断程序是
  9. android broastcast详解
  10. Android(安卓)背景图片重复 Background r