android View System touch 事件分发流程

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 树。
如下图所示:
android View System touch 事件分发流程_第1张图片

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 界面:
android View System touch 事件分发流程_第2张图片

它的 View 树结构如下图所示:
android View System touch 事件分发流程_第3张图片

一个在 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 传递的实例

未完待续。。。

你可能感兴趣的:(android,事件,System,touch)