前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >OpenHarmony 实战开发——多模输入事件分发机制详解

OpenHarmony 实战开发——多模输入事件分发机制详解

原创
作者头像
小帅聊鸿蒙
发布于 2025-04-12 13:15:23
发布于 2025-04-12 13:15:23
8500
代码可运行
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记
运行总次数:0
代码可运行

一、 多模输入概述

多模输入服务旨在支撑开发者面向用户提供丰富多样的人机交互方式,在持续完善支持传统输入的基础上,多模输入还会发挥 OpenAtom OpenHarmony(以下简称“OpenHarmony”)的分布式优势,提升跨设备交互体验,面向新场景、新业务提供系统级支撑能力。

多模输入 Input 部件是 OpenHarmony 系统级输入事件管理框架;南向对接多种输入设备,汇聚多种输入事件(按键、触摸),通过归一/标准化处理后,分发给消费者(系统服务、应用)。

南向输入设备对接包括多种类型的输入设备,如:触屏、鼠标、键盘、触摸板、遥控器。

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

首先,我们看下多模输入体系架构下的关键数据流程,方便深入了解用户从发起一次交互请求,到系统、应用给予一次交互响应的全流程。

如下图所示,包括两类关键数据流:

● 输入设备状态数据流:

输入设备状态数据描述输入设备的状态变化及其设备属性信息,包括:设备插入、移除状态、设备唯一标识、设备名称、设备支持的输入方式等。

输入设备状态数据,经过内核设备驱动上报给多模输入服务端的输入设备状态管理模块。在输入设备管理模块对全局输入设备状态进行管理和维护,同时设备状态会封装为可监听接口提供给上层业务模块用来监听系统输入外设的状态。

● 交互输入事件数据流:

交互输入事件数据用来描述键盘、鼠标、触摸屏输入事件;键盘事件包括:按键码、按键时间戳、按键所属设备等信息;鼠标事件包括:鼠标 X/Y 坐标、鼠标按钮(如:鼠标左|中|右)事件等;触摸事件包括:时间戳、触摸位置 X/Y 坐标等。

输入事件数据由设备驱动上报给输入事件接收模块完成输入事件从内核空间到用户空间的转发,然后再给输入事件预处理模块完成输入事件标准化处理(按键 KeyCode 映射标准化等),最后由输入事件分发模块以系统预设分发机制和原则完成事件的分发。

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

图1 输入事件和设备状态数据流图

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

输入事件分发模块对于事件预处理说明:

  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. 输入设备热插拔接口应用场景

软键盘自适应显示:在文本编辑场景下,输入法通过监听物理键盘输入设备的热插拔操作,可自适应决策软键盘是否显示。当有物理键盘设备时,软键盘无需显示,用户输入操作通过物理键盘完成输入。当无物理键盘时,输入法弹出软键盘,用户通过软键盘完成输入操作。

DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。
代码语言:erlang
AI代码解释
复制
`欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.OpenHarmonyUboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

4. 输入设备热插拔接口使用范例

对于鼠标热插拔监听接口有了初步的认识后,让我们来详细了解下,在实际开发中如何使用输入设备热插拔接口:

1)首先导入模块

import inputDevice from '@ohos.multimodalInput.inputDevice';

2) 通过监听接口实现输入设备热插拔事件监听:

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
// 输入法在软键盘显示逻辑中通过订阅物理键盘的状态:插入/拔出
// 根据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)通过取消监听接口实现输入设备热插拔事件取消监听:

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
listener: function(data) {
    console.log("type: " + data.type + ", deviceId: " + data.deviceId);
}
// 单独取消listener的监听。
inputDevice.off("change", this.listener);
// 取消所有监听
inputDevice.off("change");// 取消监听后,软键盘默认都弹出

注:取消热插拔事件监听接口中,入参listener可选;当入参带listener代表取消特定监听回调。当入参不带listener,代表取消所有监听回调。

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师。
LoveWFan
2018/08/07
5460
Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
只了解View的事件分发是不够的,来看下输入系统对事件的处理
在上一篇文章中,我们学习了IMS的诞生(创建),IMS创建后还会进行启动,这篇文章我们来学习IMS的启动过程和输入事件的处理。
用户1269200
2018/12/18
7420
只了解View的事件分发是不够的,来看下输入系统对事件的处理
Android高频面试专题 - 提升篇(三)事件分发机制
当用户点击屏幕里View或者ViewGroup的时候,将会产生一个事件对象,这个事件对象就是MotionEvent对象,这个对象记录了事件的类型,触摸的位置,以及触摸的时间等。MotionEvent里面定义了事件的类型,其实很容易理解,因为用户可以在屏幕触摸,滑动,离开屏幕动作,分别对应:
Android扫地僧
2020/03/19
2.4K0
Android | 输入系统(IMS)
一般情况下很多同学对于点击事件的认识都只存在于从 Activity 开始的,然后从 Window 中进行分发,甚至有些人可能也只知道 onTouchEvent 和 dispatchTouchEvetn 这几个方法,对于 View 层的了解都不属性。
345
2023/03/08
1.5K0
Android | 输入系统(IMS)
一次触摸,Android到底干了啥
当我们在写带有UI的程序的时候,如果想获取输入事件,仅仅是写一个回调函数,比如(onKeyEvent,onTouchEvent….),输入事件有可能来自按键的,来自触摸的,也有来自键盘的,其实软键盘也是一种独立的输入事件。那么为什么我能通过回调函数获取这些输入事件呢?系统是如何精确的让程序获得输入事件并去响应的呢?为什么系统只能同一时间有一个界面去获得触摸事件呢? 下面我们通过Android系统输入子系统的分析来回答这些问题。
WeTest质量开放平台团队
2018/10/29
8580
拇指记者打探事件分发机制背后的秘密(上)
聊到事件分发,很多朋友就会想到view的dispatchTouchEvent,其实在此之前,Android还做了很多工作。
码上积木
2021/04/16
4670
一次触摸,Android 到底干了啥
WeTest质量开放平台团队
2017/11/17
3.2K3
一次触摸,Android 到底干了啥
嵌入式输入系统应用编程
先来了解什么是输入设备? 常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户通过这些输入设备与 Linux 系统进行数据交换。
韦东山
2020/09/30
1.4K0
android view事件分发机制_android事件分发流程图
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!
全栈程序员站长
2022/09/30
6530
android view事件分发机制_android事件分发流程图
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )
韩曙亮
2023/03/29
2.1K0
Android必知必会--事件分发机制
所谓的安卓事件是什么?具体来说的就是点击和滑动两个操作;抽象着来说就是下面的表格。
ClericYi
2020/07/21
6140
你需要掌握的事件分发高阶知识
在只了解View的事件分发是不够的,来看下输入系统对事件的处理这篇文章中,我们知道InputReader会对原始输入事件进行加工,如果事件的类型为按键类型的事件,就会调用如下一段代码。 frameworks/native/services/inputflinger/InputDispatcher.cpp
用户1269200
2018/12/25
1.3K0
Android--事件分发机制(一)
在安卓中如果我们需要点击一个控件,并做处理的话,首先想到的就是setOnClickListener方法和setOnTouchListener方法,而在自定义控件中,需要自己处理触摸事件的话,我们需要改写onTouchEvent方法。这些方法的执行顺序和怎么被调用的,就是今天的研究课题 首先自定义一个控件,并改写onTouchEvent方法,打印日志 /** * 测试事件分发顺序 */ public class MyView extends View { public static final S
aruba
2020/07/03
6840
Android事件分发机制抽象--钓钩模型
用户体验小姐姐巧妙地利用有限的手机屏幕空间,完美地设计出简单实用的交互功能,如果多问一句 “怎么做到的” ? 答案必须是从事件分发机制的高超运用说起。
用户1907613
2020/12/15
6990
Android事件分发机制抽象--钓钩模型
View事件分发机制源码解析
注:本文解析的源码基于 API 25,部分内容来自于《Android开发艺术探索》。
俞其荣
2022/07/28
3870
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )
韩曙亮
2023/03/29
1.3K0
便携式钻孔测斜仪数据采集仪的使用方法
开机前,请将测斜探头连接到采集仪传感器接口上。禁止开机后带电插拔探头。按下电源开关按钮,电源指示灯亮(按钮外环),主设备通电,屏幕启动,操作系统启动完成后,若设置了测斜程序自动启动则进入测斜仪程序主界面,否则进入操作系统桌面。
河北稳控科技
2023/03/31
6610
便携式钻孔测斜仪数据采集仪的使用方法
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )
【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 ) 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )
韩曙亮
2023/03/29
1.2K0
Android事件分发机制源码解析
在Android设备中,触摸事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作等。一个最简单的用户触摸事件一般经过以下几个流程:
Android技术干货分享
2019/07/03
7910
Android事件分发机制源码解析
Android面试老生常谈的 View 事件分发机制,看这一篇就够了!
在 Android 开发当中,View 的事件分发机制是一块很重要的知识。不仅在开发当中经常需要用到,面试的时候也经常被问到。
程序员徐公
2021/06/01
6940
Android面试老生常谈的 View 事件分发机制,看这一篇就够了!
推荐阅读
相关推荐
Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档