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

199 篇文章 0 订阅
198 篇文章 0 订阅

前言

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

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

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

image.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

多模输入服务启动
image.png

应用层的流程图
image.png

写在最后

●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
●点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
●更多鸿蒙最新技术知识点,请移步前往小编:https://gitee.com/

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值