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) | 设置相对屏幕坐标原点的偏移位置。 |
getPointerPosition(int index) | 获取一次事件中触控或轨迹追踪的某个指针相对于偏移位置的坐标。 |
getPointerScreenPosition(int index) | 获取一次事件中触控或轨迹追踪的某个指针相对屏幕坐标原点的坐标。 |
getRadius(int index) |