OpenHarmony开发者论坛

标题: 触摸事件及分发机制详解 [打印本页]

作者: Laval社区小助手    时间: 2024-5-15 14:15
标题: 触摸事件及分发机制详解
[md]# 前言

多模输入标准系统组件提供传统的输入交互方式,例如按键、触控、键盘、鼠标等。 本应用于标准系统之上,为设备提供单指触控输入能力。本组件将触屏输入产生的事件上报到JS UI框架或用户程序框架,JS UI框架根据上报的事件再次封装,对应用提供接口。

# 版本

OpenHarmony 3.1 release

# 源码目录

```
/foundation/multimodalinput/input
├── common                       # 公共代码
├── interfaces                   # 对外接口存放目录
│   └── native                   # 对外native层接口存放目录
│       └── innerkits            # 对系统内部子系统提供native层接口存放目录
├── service                      # 服务框架代码
├── sa_profile                   # 服务启动配置文件
├── uinput                       # 输入事件注入模块
```

通过每个目录下的.gn文件可以看到每个目录下的模块都对应动态库

\\interfaces\\native\\innerkits\\event下的文件编出来的是mmi\_event.so

\\interfaces\\native\\innerkits\\napi下的文件编出来的是injecteventhandler.so

\\interfaces\\native\\innerkits\\proxy下的文件编出来的是libmultimodalinput\_proxy.so

\\service下的文件编出来的是libmultimodalinput\_service.so

\\uinput下的文件编出来的是mmi\_uinject.so

# NAPI四大模块

##### 1. inputConsumer 组合按键

模块提供对按键事件的监听。

对应的NAPI接口文件 `foundation\multimodalinput\input\frameworks\napi\input_consumer\src\js_register_module.cpp`

| 接口方法名 | 功能                                                                                                       | 系统能力                                             |
| ---------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| on         | 开始监听组合按键事件, 当满足条件的组合按键输入事件发生时,将keyOptions回调到入参callback表示的回调函数上。 | SystemCapability.MultimodalInput.Input.InputConsumer |
| off        | 停止监听组合按键事件。 停止监听组合按键事件。                                                              | SystemCapability.MultimodalInput.Input.InputConsumer |

##### 2. inputDevice 输入设备

用于监听输入设备连接、断开和变化,并查看输入设备相关信息。比如监听鼠标插拔,并获取鼠标的id、name和指针移动速度等信息。

对应的NAPI接口文件 `foundation\multimodalinput\input\frameworks\napi\input_device\src\native_register_module.cpp`

| 接口方法名   | 功能                                                              | 系统能力                                           |
| ------------ | ----------------------------------------------------------------- | -------------------------------------------------- |
| getDevice    | 获取输入设备的描述信息,使用callback或Promise方式作为异步方法。   | SystemCapability.MultimodalInput.Input.InputDevice |
| getDeviceIds | 获取所有输入设备的id列表,使用callback或Promise方式作为异步方法。 | SystemCapability.MultimodalInput.Input.InputDevice |

##### 3. inputEventClient 注入按键

InputEventClient模块提供了注入按键能力。

对应的NAPI接口文件 `foundation\multimodalinput\input\frameworks\napi\input_event_client\src\js_register_module.cpp`

| 接口方法名  | 功能                                     | 系统能力                                              |
| ----------- | ---------------------------------------- | ----------------------------------------------------- |
| injectEvent | 注入按键,KeyEvent为注入按键的描述信息。 | SystemCapability.MultimodalInput.Input.InputSimulator |

##### 4. inputMonitor 输入监听

InputMonitor模块提供了监听全局触摸事件的功能。 对应的NAPI接口文件 `foundation\multimodalinput\input\frameworks\napi\input_monitor\src\js_input_monitor_module.cpp`

| 接口方法名 | 功能                   | 系统能力                                            |
| ---------- | ---------------------- | --------------------------------------------------- |
| on         | 开始监听全局触屏事件。 | SystemCapability.MultimodalInput.Input.InputMonitor |
| off        | 停止监听全局触屏事件。 | SystemCapability.MultimodalInput.Input.InputMonitor |

# 输入事件和设备状态数据流介绍

参考以下数据流图,我们可以很清晰地了解到在用户通过输入设备发起一次交互请求后,输入事件上报和分发全流程。

![](https://devpress.csdnimg.cn/96f565f314fd42348eb4d6175f1bcd71.png)

图1 输入事件和设备状态数据流图

注:数据流图箭头示意说明

● 输入设备状态数据流:

输入设备状态数据描述输入设备的状态变化及其设备属性信息,包括:设备插入、移除状态、设备唯一标识、设备名称、设备支持的输入方式等。

输入设备状态数据,经过内核设备驱动上报给多模输入服务端的输入设备状态管理模块。在输入设备管理模块对全局输入设备状态进行管理和维护,同时设备状态会封装为可监听接口提供给上层业务模块用来监听系统输入外设的状态。

● 交互输入事件数据流:

交互输入事件数据用来描述键盘、鼠标、触摸屏输入事件;键盘事件包括:按键码、按键时间戳、按键所属设备等信息;鼠标事件包括:鼠标 X/Y 坐标、鼠标按钮(如:鼠标左|中|右)事件等;触摸事件包括:时间戳、触摸位置 X/Y 坐标等。

输入事件数据由设备驱动上报给输入事件接收模块完成输入事件从内核空间到用户空间的转发,然后再给输入事件预处理模块完成输入事件标准化处理(按键 KeyCode 映射标准化等),最后由输入事件分发模块以系统预设分发机制和原则完成事件的分发。

输入事件分发模块对于事件预处理说明:

1)输入事件分发过程会优先经过输入事件拦截模块,当有拦截器注册时,输入事件会终止继续上报,相应的拦截器会拦截所有输入事件。该事件拦截特性当前主要支持无障碍模式。

2)当没有拦截器注册时,输入事件会上报给输入事件监听模块,系统级应用(如:系统设置、桌面)通过监听输入事件,支持系统级特性(如:状态栏隐藏/消失等)。

3)事件监听模块对事件的监听不会阻断事件继续上报;支持事件监听的同时,输入事件还会继续上报。

4)对于按键事件会上报给订阅按键分发模块处理,分发给对应的应用处理,事件分发流程结束。

5)其他触摸屏事件和鼠标事件不会经过订阅按键分发模块,会继续上报给应用窗口处理。

# 多模输入事件分发原则

##### 1. 鼠标/触摸屏事件分发原则

鼠标/触摸屏坐标指向哪个目标,输入事件就分发给对应的目标。

鼠标/触摸屏事件分发特殊场景说明:

1. 如没有鼠标上的按钮按下,当前鼠标指向哪个目标,鼠标输入事件就分发给坐标锁定的目标。
2. 如果有鼠标上的按钮按下,以第一个按钮按下时刻鼠标坐标锁定的目标作为分发标的,直到所有的按钮都抬起。
3. 触摸屏输入时,将第一个手指按下锁定的目标作为输入事件分发标的,直到所有的手指都抬起。

##### 2. 按键事件分发原则

按键事件分发以当前用户可视界面中的焦点作为分发标的,当前界面焦点在哪个目标上,按键事件就分发给对应的目标。

# 多模输入服务启动流程

多模输入的服务ID MULTIMODAL\_INPUT\_CONNECT\_SERVICE\_ID = 3101,文件路径 `foundation\multimodalinput\input\service\module_loader\src\mmi_service.cpp`

多模输入服务启动

![](https://devpress.csdnimg.cn/397d809ad7374f41a8e212da9a99fbed.png)

应用层的流程图

![](https://devpress.csdnimg.cn/c779c289215148cbb56a30c8a75b71c7.png)
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5