返回

感知触屏背后,精妙的事件分发机制解析

Android

当我手指触摸到手机屏幕后,给我所见即所得的触控体验,它的背后发生了什么?出于对它的好奇,就有了这篇文章。

漫谈事件分发机制

事件分发系统实际上就是一个消息路由器。它监听手机上的各种输入事件,包括触屏、键盘、鼠标,甚至遥控器等,再把这些消息传递给适当的组件。

1. 触控事件的产生

首先我们先了解一下触控事件的产生,先看下图:

当手指触摸屏幕时,屏幕上一个电容传感器产生电荷。手机的芯片检测到电荷变化后,将它转换为坐标数据,再传递给系统。系统接着会判断这些坐标是否位于某个视图上,并以此判断手指落在了哪个视图上。

2. 事件分发过程

当系统知道手指落在了哪个视图上后,就会调用这个视图的onTouchEvent方法,这个方法就是分发事件的入口。

onTouchEvent方法会根据事件类型,调用不同的处理方法。例如,当手指按下屏幕时,它会调用onTouchEvent的ACTION_DOWN方法;当手指移动时,它会调用ACTION_MOVE方法;当手指抬起时,它会调用ACTION_UP方法。

这些处理方法会根据事件类型执行不同的操作。例如,ACTION_DOWN方法会将手指按下的位置作为参数传递给视图,视图可以根据这个位置来判断用户想做什么。

3. 事件分发的去向

视图处理完事件后,会将事件传递给它的父视图。父视图也会调用自己的onTouchEvent方法,并将事件传递给它的父视图。依次类推,直到事件到达顶层的视图。

顶层的视图处理完事件后,事件就会被分发到其他视图。其他视图也会调用自己的onTouchEvent方法,并将事件传递给它的子视图。依次类推,直到事件到达最初的视图。

4. 控件点击事件执行顺序

关于一个控件点击事件执行顺序,一个简单且常见的控件点击事件的处理过程:

  1. 用户点击按钮,控件接收到点击事件,其onTouchEvent()方法被调用。
  2. 该控件的onTouchEvent()方法检测该事件类型,如果为ACTION_DOWN事件,则执行相应的代码,比如改变控件的外观。
  3. 事件向控件的父控件传递,并且父控件的onTouchEvent()方法被调用。
  4. 父控件的onTouchEvent()方法也检测事件类型,如果为ACTION_DOWN事件,则执行相应的代码,比如改变父控件的外观。
  5. 事件继续向上传递,直到到达顶层的父控件,如果为Activity,其onTouchEvent()方法被调用。
  6. 顶层的父控件(Activity)处理完事件,再将其传递给该控件的子控件。
  7. 子控件接收到事件,其onTouchEvent()方法被调用,并执行相应的代码。

总结

以上就是Android中的事件分发机制原理。希望通过这篇文章,你对事件分发机制有了一定的了解。