【鸿蒙南向开发】OpenHarmony 源码解析之多模输入子系统(事件派发流程)

1 简介

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

1.1 OpenHarmony 架构图

image.png

1.2 系统框架

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

image.png

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 systemuinavigationbar的源码中看到, 当点击navigationbarback键的时候,就会调用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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值