MotionEvent的生成与分发流程

155 阅读2分钟

MotionEvent在Android中的生成与分发流程梳理

一、MotionEvent的生成

  1. 用户交互

    • 用户通过触摸屏幕(单点或多点)与设备交互。
    • 触摸屏硬件的传感器(如触摸屏控制器)响应触摸行为。
  2. 硬件层面处理

    • 触摸屏硬件捕获触摸信息(位置、压力、接触面积等),并转换为电信号。
    • 硬件进行初步的信号处理,如滤波和去噪。
  3. Linux内核处理

    • Linux内核的输入子系统接收处理后的数字信号。
    • 将信号转换为特定的事件类型(如按下、移动、抬起等)。
    • 这些事件通过事件队列等机制传递给Android系统。
  4. Android框架封装

    • Android的InputManagerService等框架层组件接收内核传递的事件。
    • 将事件封装为MotionEvent对象,包含事件类型、位置、压力等详细信息。

二、MotionEvent的分发

  1. 初始分发至Activity

    • MotionEvent对象首先被传递给当前前台的Activity。
    • Activity通过dispatchTouchEvent(MotionEvent ev)方法开始事件的分发流程。
  2. Window与DecorView的传递

    • Activity中的Window(通常是PhoneWindow)将事件传递给DecorView。
    • DecorView作为View树的根容器,是事件传递的下一站。
  3. View树中的分发

    • 事件从DecorView开始,在View树中自上而下分发(down事件)。
    • ViewGroup可以通过onInterceptTouchEvent(MotionEvent ev)判断是否拦截事件。
    • 若不拦截,事件继续传递给子View;若拦截,则在ViewGroup内部处理。
    • 接收事件的View或ViewGroup在onTouchEvent(MotionEvent ev)中处理事件,并返回是否消费(true/false)。
  4. 事件回溯机制

    • 若事件在向下分发过程中未被任何View消费,则开始向上回溯。
    • 回溯过程中,父View有机会处理未被子View消费的事件。
  5. 回到Activity

    • 若事件在整个View树中未被消费,最终会回到Activity的onTouchEvent(MotionEvent ev)
    • Activity可以在此方法中处理剩余事件,或传递给系统其他部分。

总结: MotionEvent的生成涵盖了用户输入、硬件处理、Linux内核转换和Android框架封装等阶段。 其分发过程则是一个在View树中自上而下分发、自下而上回溯的循环,直到事件被某个View或Activity消费。 这一机制确保了Android系统能够高效且灵活地处理用户触摸事件。