View 系统触摸事件的分发流程

touch 事件输入流程

touch 输入事件是用户对触摸屏进行触摸操作后,Linux 操作系统产生的一系列输入事件。

在 Android 的 System Server 进程中, InputReader 线程专门读取 Linux 操作系统产生的输入事件, InputDispatcher 线程专门分发 InputReader 读取的输入事件,InputDispatcher 是通过 pipe 把输入事件分发给对应的 application。
在 application 端,looper 的 loop 函数的每一次循环中,在从MessageQueue 取出消息以前,都会调用 nativePollOnce 方法从 pipe 中取出 InputDispacher 分发过来的输入事件。经过预处理,转换为 MotionEvent 发送到消息队列。之后,在某次消息循环中,该 MotionEvent 被 ViewRoot 通过 deliverPointerEvent 方法分发给 View 树。
如下图所示:

MotionEvent 包含了触摸的时间、位置、历史记录、第几个手指触摸等信息。MotionEvent 有 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POINTER_UP, ACTION_CANCEL 这些类别。
每一个完整的触摸手势,都是由一些列的 MotionEvent 构成。比如 ACTION_DOWN,ACTION_MOVE,…,ACTION_UP 构成一个单手指手势。

MotionEvent 在 View 树中的传递过程

MotionEvent 在 View 树中传递的两个阶段

MotionEvent 在 View 树中的传递是从 Activity 的 dispatchTouchEvent 函数开始的。MotionEvent 一次完整的传递过程包含两个阶段,一个阶段是从 View 树的根节点向 View 树的末端节点传递的过程,我们把这个过程叫做向下传递;另一个阶段是从 View 树的末端节点像 View 树的根节点传递的过程,我们把这个过程叫做向上传递。这和 js 里面DOM树的事件传递模型很像。

如下图所示的 UI 界面:

它的 View 树结构如下图所示:

一个在 layout4 位置的 touch 事件在这个树里面的传递的两个阶段如下图所示:

MotionEvent 在 View 树中传递的控制

一个 MotionEvent 完整的传递过程如上图所示,View System 给我们提供了控制 MotionEvent 在 View 树中传递的方法。通过重写 View 的 onInterceptTouchEvent ,控制 onInterceptTouchEvent 的返回值可以控制 MotionEvent 在 View 树中是否向下传递

MotionEvent 在 View 树中的处理

View System 给我们提供了处理在 View 树上传递的 MotionEvent 的方法。通过重写 view 的 onTouchEvent ,可以处理传递到该 view 的 MotionEvent。通过控制 onTouchEvent 的的返回值可以控制 MotionEvent 在 View 树中是否向上传递

一系列 MotionEvent 在 View 树中的传递

一个完整的手势一般包含 ACTION_DOWN,ACTION_MOVE,ACTION_UP 3种类型 MotionEvent。
未完待续。。。

控制和处理 MotionEvent 传递的实例

未完待续。。。

更多相关文章

  1. android ViewFlipper的使用
  2. Android8.0 图形引擎的心跳 - Vsync信号
  3. android 实现表格上下滑,左右滑,并且标题也跟着滑
  4. Android(安卓)一个应用的执行过程
  5. 为什么Looper.loop()死循环不会导致ANR
  6. 拉票水文一篇之Google android优秀博文大赛 (*^__^*) ~~~
  7. ios开发之ios中控件
  8. Android技术博文汇总
  9. 从华为事件,看 Google Android(安卓)的独断专制!

随机推荐

  1. linux上mongodb的安装与卸载
  2. 少不更事爱前端,每天都想着转后端。
  3. Oracle的用户权限及其管理操作
  4. 带你一起了解PHP的错误类型和错误级别
  5. 为什么使用PreparedStatement?
  6. 使用面向对象方法实现用户信息增删改查
  7. 在服务器上排除问题的头 5 分钟
  8. 初探MySQL Innodb集群
  9. 关于数据库的一些常识
  10. 数据库--存储过程详解