乐趣区

关于openharmony:多模输入事件分发机制详解

一、多模输出概述
多模输出服务旨在撑持开发者面向用户提供丰盛多样的人机交互形式,在继续欠缺反对传统输出的根底上,多模输出还会施展 OpenAtom OpenHarmony(以下简称“OpenHarmony”)的分布式劣势,晋升跨设施交互体验,面向新场景、新业务提供零碎级撑持能力。
多模输出 Input 部件是 OpenHarmony 零碎级输出事件治理框架;南向对接多种输出设施,汇聚多种输出事件 (按键、触摸),通过归一 / 标准化解决后,分发给消费者(零碎服务、利用)。
南向输出设施对接包含多种类型的输出设施,如:触屏、鼠标、键盘、触摸板、遥控器。
二、输出事件和设施状态数据流介绍
首先,咱们看下多模输出体系架构下的要害数据流程,不便深刻理解用户从发动一次交互申请,到零碎、利用给予一次交互响应的全流程。
如下图所示,包含两类要害数据流:
● 输出设施状态数据流:
输出设施状态数据形容输出设施的状态变动及其设施属性信息,包含:设施插入、移除状态、设施惟一标识、设施名称、设施反对的输出形式等。
输出设施状态数据,通过内核设施驱动上报给多模输出服务端的输出设施状态治理模块。在输出设施治理模块对全局输出设施状态进行治理和保护,同时设施状态会封装为可监听接口提供给下层业务模块用来监听系统输出外设的状态。
● 交互输出事件数据流:
交互输出事件数据用来形容键盘、鼠标、触摸屏输出事件;键盘事件包含:按键码、按键工夫戳、按键所属设施等信息;鼠标事件包含:鼠标 X/Y 坐标、鼠标按钮 (如:鼠标左 | 中 | 右) 事件等;触摸事件包含:工夫戳、触摸地位 X/Y 坐标等。
输出事件数据由设施驱动上报给输出事件接管模块实现输出事件从内核空间到用户空间的转发,而后再给输出事件预处理模块实现输出事件标准化解决 (按键 KeyCode 映射标准化等),最初由输出事件散发模块以零碎预设散发机制和准则实现事件的散发。
参考以下数据流图,咱们能够很清晰地理解到在用户通过输出设施发动一次交互申请后,输出事件上报和散发全流程。

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

输出事件散发模块对于事件预处理阐明:
1) 输出事件散发过程会优先通过输出事件拦挡模块,当有拦截器注册时,输出事件会终止持续上报,相应的拦截器会拦挡所有输出事件。该事件拦挡个性以后次要反对无障碍模式。
2) 当没有拦截器注册时,输出事件会上报给输出事件监听模块,零碎级利用 (如:零碎设置、桌面) 通过监听输出事件,支持系统级个性(如:状态栏暗藏 / 隐没等)。
3) 事件监听模块对事件的监听不会阻断事件持续上报;反对事件监听的同时,输出事件还会持续上报。
4) 对于按键事件会上报给订阅按键散发模块解决,分发给对应的利用解决,事件散发流程完结。
5) 其余触摸屏事件和鼠标事件不会通过订阅按键散发模块,会持续上报给利用窗口解决。

三、多模输出事件散发准则

1. 鼠标 / 触摸屏事件散发准则
鼠标 / 触摸屏坐标指向哪个指标,输出事件就分发给对应的指标。
鼠标 / 触摸屏事件散发非凡场景阐明:
1) 如没有鼠标上的按钮按下,以后鼠标指向哪个指标,鼠标输出事件就分发给坐标锁定的指标。
2) 如果有鼠标上的按钮按下,以第一个按钮按下时刻鼠标坐标锁定的指标作为散发标的,直到所有的按钮都抬起。
3) 触摸屏输出时,将第一个手指按下锁定的指标作为输出事件散发标的,直到所有的手指都抬起。
2. 按键事件散发准则
按键事件散发以以后用户可视界面中的焦点作为散发标的,以后界面焦点在哪个指标上,按键事件就分发给对应的标的。

四、OpenHarmony 3.1 版本新增接口阐明

为了更好的反对下层利用和零碎服务实时检测和解决输出设施热插拔状态变更事件,在 OpenHarmony 3.1 版本新增凋谢了 JS API 接口,可反对通过 JS API 监听设施的热插拔事件。同时提供通过注册回调接口的形式获取热插拔输出设施惟一标识。输出设施热插拔监听接口与 inputDevice.getDevice 接口配合即可获取热插拔设施的详细信息,包含:输出设施名称、设施反对的输出类型 (键盘 | 触摸屏 | 鼠标 | 游戏手柄) 等。
1. 多模输出子系统新增接口阐明
输出外设热插拔监听接口:function on(type: “change”, listener: Callback<DeviceListener>): void; 输出外设勾销监听接口:function off(type:“change”, listener?: CallbackDeviceListener): void;
2. 新增接口接口参数阐明
【DeviceListener】

【ChangeType】

3. 输出设施热插拔接口利用场景
软键盘自适应显示:在文本编辑场景下,输入法通过监听物理键盘输入设施的热插拔操作,可自适应决策软键盘是否显示。当有物理键盘设施时,软键盘无需显示,用户输出操作通过物理键盘实现输出。当无物理键盘时,输入法弹出软键盘,用户通过软键盘实现输出操作。
4. 输出设施热插拔接口应用范例
对于鼠标热插拔监听接口有了初步的意识后,让咱们来具体理解下,在理论开发中如何应用输出设施热插拔接口:
1) 首先导入模块
import inputDevice from ‘@ohos.multimodalInput.inputDevice’;
2) 通过监听接口实现输出设施热插拔事件监听:

// 输入法在软键盘显示逻辑中通过订阅物理键盘的状态:插入 / 插入
// 依据 isPhysicalkeyboardExist 的值决定软键盘是否弹出
...
let isPhysicalkeyboardExist = false;
inputDevice.on("change", (callback) => {console.log("type:" + callback.type + ", deviceId:" + callback.deviceId);
  inputDevice.getDevice(callback.deviceId, (ret) => {console.log("The keyboard type of the device is:" + ret);
    if (ret == keyboard.ALPHABETIC_KEYBOARD && callback.type == 'add') { // 热插拔设施为键盘
      isPhysicalkeyboardExist = true;
    } else if (ret == keyboard.ALPHABETIC_KEYBOARD && callback.type == 'remove') {isPhysicalkeyboardExist = false;}
  });
});
...

3)通过勾销监听接口实现输出设施热插拔事件勾销监听:

listener: function(data) {console.log("type:" + data.type + ", deviceId:" + data.deviceId);
}
// 独自勾销 listener 的监听。inputDevice.off("change", this.listener);
// 勾销所有监听
inputDevice.off("change");// 勾销监听后,软键盘默认都弹出

注:勾销热插拔事件监听接口中,入参 listener 可选;当入参带 listener 代表勾销特定监听回调。当入参不带 listener,代表勾销所有监听回调。
通过上述介绍,置信大家对 OpenHarmony 多模输出子系统的输出事件处理和散发机制有了一个全面的理解。同时咱们也对 OpenHarmony 3.1 版本新增的输出设施热插拔监听接口做了具体的介绍,更多无关多模输出子系统为开发者提供的 API 接口欢送拜访 Gitee 具体理解:
https://gitee.com/openharmony…

置信大家在后续开发中有了下面这些基础知识作为铺垫,在后续开发中便能够更加熟能生巧,开发出交互体验更好的利用来。期待与宽广开发者一起独特构建极致用户体验。最初,期待诸位携手一起共建,可在 OpenHarmony 社区 (https://gitee.com/openharmony) 一起交换探讨。

退出移动版