问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【鸿蒙南向开发】触摸事件及分发机制详解

创作时间:
作者:
@小白创作中心

【鸿蒙南向开发】触摸事件及分发机制详解

引用
CSDN
1.
https://blog.csdn.net/HarmonyOS_666/article/details/141000179

本文详细介绍了鸿蒙系统的多模输入系统组件、版本、源码目录结构、NAPI四大模块的功能,以及输入事件和设备状态的数据流、多模输入事件的分发原则和多模输入服务的启动流程。

前言

多模输入标准系统组件提供传统的输入交互方式,例如按键、触控、键盘、鼠标等。 本应用于标准系统之上,为设备提供单指触控输入能力。本组件将触屏输入产生的事件上报到 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

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

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

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

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

● 输入设备状态数据流:
输入设备状态数据描述输入设备的状态变化及其设备属性信息,包括:设备插入、移除状态、设备唯一标识、设备名称、设备支持的输入方式等。
输入设备状态数据,经过内核设备驱动上报给多模输入服务端的输入设备状态管理模块。在输入设备管理模块对全局输入设备状态进行管理和维护,同时设备状态会封装为可监听接口提供给上层业务模块用来监听系统输入外设的状态。

● 交互输入事件数据流:
交互输入事件数据用来描述键盘、鼠标、触摸屏输入事件;键盘事件包括:按键码、按键时间戳、按键所属设备等信息;鼠标事件包括:鼠标 X/Y 坐标、鼠标按钮(如:鼠标左 | 中 | 右)事件等;触摸事件包括:时间戳、触摸位置 X/Y 坐标等。
输入事件数据由设备驱动上报给输入事件接收模块完成输入事件从内核空间到用户空间的转发,然后再给输入事件预处理模块完成输入事件标准化处理(按键 KeyCode 映射标准化等),最后由输入事件分发模块以系统预设分发机制和原则完成事件的分发。

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

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

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

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

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

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

多模输入事件分发原则

  1. 鼠标/触摸屏事件分发原则
    鼠标/触摸屏坐标指向哪个目标,输入事件就分发给对应的目标。
    鼠标/触摸屏事件分发特殊场景说明:

  2. 如没有鼠标上的按钮按下,当前鼠标指向哪个目标,鼠标输入事件就分发给坐标锁定的目标。

  3. 如果有鼠标上的按钮按下,以第一个按钮按下时刻鼠标坐标锁定的目标作为分发标的,直到所有的按钮都抬起。

  4. 触摸屏输入时,将第一个手指按下锁定的目标作为输入事件分发标的,直到所有的手指都抬起。

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

多模输入服务启动流程

多模输入的服务 ID MULTIMODAL_INPUT_CONNECT_SERVICE_ID = 3101,文件路径
foundation\multimodalinput\input\service\module_loader\src\mmi_service.cpp
多模输入服务启动
应用层的流程图

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号