1 简介
多模输入系统主要用于接收按键,触摸等输入事件,并且会对这些原始输入事件进行处理,之后再对这些事件进行派发。同时多模输入系统还提供了注入事件的接口,应用可以通过调用这个接口产生输入事件,然后将该输入事件注入到输入系统中进行处理。
1.1 OpenHarmony 架构图

1.2 系统框架
- 多模输入系统主要是由
InputManagerService,InputEventHub,InputEventDistributer来负责处理的。 InputManagerService会启动InputEventHub,并且会通过创建子线程的方式来创建InputEventDistributer。- 当底层传来按键或触摸事件的时候,
InputEventHub就会进行读取,并且会对这些原始的输入事件进行处理,处理完后会交给InputEventDistributer进行派发。 InputEventDistributer又会通过InputEventClientProxy进行IPC交互的方式发给应用端。

2 基础知识
2.1 代码结构
/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
3 事件注入接口
多模输入目前提供的接口为事件注入接口,该接口目前仅对系统应用开放。
3.1 JS接口
InJectEventHandler是处理注入事件类。
| 接口名 | 描述 |
|---|---|
| function injectEventSync(keyEvent: KeyEvent) | 注入按键事件的JS层接口 |
\applications\standard\systemui\navigationBar\src\main\js\default\pages\backKey\backKey.js
export default {
/**
* User start touching the back button
*/
backTouchStart() {
mLog.showInfo(TAG, `back touch start`);
res = input.injectEventSync({
isPressed: true,
keyCode: 2,
keyDownDuration: 1
});
mLog.showInfo(TAG, `injectEventHandler injectEventSync down res: ${res}`);
},
/**
* User stop touching the back button
* Trigger "Back" event
*/
backTouchEnd() {
mLog.showInfo(TAG, `back touch end and injectEventHandler injectEventSync`);
res = input.injectEventSync({
isPressed: false,
keyCode: 2,
keyDownDuration: 1
});
mLog.showInfo(TAG, `injectEventHandler injectEventSync up res: ${res}`);
}
}
可以从openharmony systemui的navigationbar的源码中看到, 当点击navigationbar的back键的时候,就会调用js的接口函数injectEventSync,并传入三个参数,其中:
isPress: 按键的状态,true表示down, false表示up
keyCode: 键值码,2表示back事件
keyDownDuration: 按键按下到抬起之间的时长,单位ms,1表示1ms
3.2 C++接口
| 接口名 | 描述 |
|---|---|
| bool InjectEvent(const sptr event) | 注入按键事件的C++层接口 |
3.3 系统内部接口
在\interfaces\native\innerkits\events\include下的头文件都定义了各自对内部系统调用的口。
KeyEvent的主要接口
| 接口名 | 描 |
|---|---|
| getKeyCode() | 获取当前按键类事件的keycode值。 |
| getMaxKeyCode() | 获取当前定义的按键事件的最大keycode值。 |
| getKeyDownDuration() | 获取当前按键被按下的持续时长。 |
| isKeyDown() | 获取当前按键事件是否是按下状态。 |
KeyBoardEvent的主要接口
| 接口名 | 描述 |
|---|---|
| enableIme() | 启动输入法编辑器。 |
| disableIme() | 关闭输入法编辑器。 |
| isHandledByIme() | 判断输入法编辑器是否在使用。 |
| isNoncharacterKeyPressed(int keycode) | 判定输入的单个NoncharacterKey是否处于按下状态。 |
| isNoncharacterKeyPressed(int keycode1, int keycode2) | 判定输入的两个NoncharacterKey是否都处于按下状态。 |
| isNoncharacterKeyPressed(int keycode1, int keycode2, int keycode3) | 判定输入的三个NoncharacterKey是否都处于按下状态。 |
| getUnicode() | 获取按键对应的Unicode码。 |
ManipulationEvent的主要接口
| 接口名 | 描述 |
|---|---|
| getPointerCount() | 获取一次事件中触控或轨迹追踪的指针数量。 |
| getPointerId(int index) | 获取一次事件中,指针的唯一标识Id。 |
| setScreenOffset(float offsetX, float offsetY) | 设置相对屏幕坐标原点的偏移位置。 |
鸿蒙多模输入系统解析

最低0.47元/天 解锁文章
1906

被折叠的 条评论
为什么被折叠?



