多模输入事件标准化概述
概述
随着用户输入的多样化发展,一个应用程序需要响应多种输入事件,以支持用户使用不同的输入设备(方式)与其进行交互(例如使用遥控器、语音等同时操控智慧屏)。同时,开发者针对同一输入动作的处理,存在不同的设计,这就给用户造成了体验上的差异。
多模输入在已支持的输入事件的基础上,将用户常用的一些输入动作定义为一组标准化事件,将不同输入设备的输入事件映射到标准化事件上。使用户在使用多种输入设备操作不同的终端设备或应用时,能够得到统一的体验。
输入事件类型
输入事件,即用户为了控制终端设备,通过输入设备做出的一个或一组输入动作。HarmonyOS的输入系统将事件分为原始事件、基础事件、标准化事件。
原始事件
原始事件,即由输入设备产生的、未经过任何含义转换的输入事件,用于表示用户在输入设备上操作时所做出的原始输入动作。
基础事件
将手指在触屏上操作产生的原始事件定义为基础事件,为了统一体验,简化开发,HarmonyOS输入系统会将其他输入设备的输入事件映射到基础事件上。将每种基础事件进一步细化成为基本交互事件与高级交互事件。
基本交互事件
基本交互事件对应用户在输入设备上的一个输入动作,由输入系统上报,包括:手指触摸屏幕、手指触摸后移动、手指抬起。
高级交互事件
高级交互事件则是多个基本交互事件的组合,包括:单指点击、单指双击、单指长按、单指滑动、单指长按后滑动、双指缩放、双指旋转等。高级交互事件的操作对象是具体的UI控件,需要结合HarmonyOS的UI控件使用。
标准化事件
标准化事件是用于表示用户通用意图的事件,其定义与输入设备的类型无关。标准化事件分为通用标准化事件(CommonEventHandle),媒体类标准化事件(MediaEventHandle),系统类标准化事件(SystemEventHandle),通话类标准化事件(TelephoneEventHandle)。
通用标准化事件
提供标准公共事件的处理方法。常见事件包括显示菜单、发送、复制、粘贴、剪切、撤销、刷新、启动拖拽、取消、确认、转到上一个或下一个元素、打印和返回。
| 场景 | 方法 | 键盘 | 鼠标 | 遥控器 | 表冠/旋钮 | 耳机 | | -------------------- | ------------------------------------------------------------ | ---------------------------- | ---------------- | -------------- | --------- | --------- | | 显示菜单 | boolean onShowMenu(MultimodalEvent multimodalEvent) | Shift+F10Menu键 | 右键单击 | 菜单键 | 不支持 | 不支持 | | 发送 | boolean onSend(MultimodalEvent multimodalEvent) | Enter | 不支持 | 确认键 | 不支持 | 不支持 | | 复制 | boolean onCopy(MultimodalEvent multimodalEvent) | Ctrl+C | 不支持 | 不支持 | 不支持 | 不支持 | | 粘贴 | boolean onPaste(MultimodalEvent multimodalEvent) | Ctrl+V | 不支持 | 不支持 | 不支持 | 不支持 | | 剪切 | boolean onCut(MultimodalEvent multimodalEvent) | Ctrl+X | 不支持 | 不支持 | 不支持 | 不支持 | | 撤销 | boolean onUndo(MultimodalEvent multimodalEvent) | Ctrl+Z | 不支持 | 不支持 | 不支持 | 不支持 | | 刷新 | boolean onRefresh(MultimodalEvent multimodalEvent) | F5Ctrl+R | 不支持 | 不支持 | 不支持 | 不支持 | | 启动拖拽 | boolean onStartDrag(MultimodalEvent multimodalEvent) | 不支持 | 左键短按 | 不支持 | 不支持 | 不支持 | | 取消 | boolean onCancel(MultimodalEvent multimodalEvent) | Esc | 不支持 | 不支持 | 不支持 | 不支持 | | 确定/进入 | boolean onEnter(MultimodalEvent multimodalEvent) | Enter | 不支持 | 确认键 | 不支持 | 不支持 | | 下一个/上一个 / 翻页 | boolean onPrevious(MultimodalEvent multimodalEvent)/boolean onNext(MultimodalEvent multimodalEvent) | PageUpPageDown上下左右方向键 | 滑动滚轮 | 上下左右方向键 | 旋转表冠 | 双击/三击 | | 打印 | boolean onPrint(MultimodalEvent multimodalEvent) | Ctrl+P | 不支持 | 不支持 | 不支持 | 不支持 | | Back/上一级 | boolean onBack(MultimodalEvent multimodalEvent) | ESC | 某键(中键)单击 | Back键 | 不支持 | 不支持 |
媒体类标准化事件
提供处理标准媒体事件的方法。媒体事件包括播放和暂停。
| 场景 | 方法 | 键盘 | 鼠标 | 遥控器 | 表冠/旋钮 | 耳机 | | ------------------------------------------------------------ | ----------------------------------------------- | ----------- | ------ | ------ | --------- | ---- | | 暂停/播放 | boolean onPlay(MultimodalEvent multimodalEvent) | Space空格键 | 不支持 | 确认键 | 不支持 | 单击 | | boolean onPause(MultimodalEvent multimodalEvent)/boolean onMediaControl(MultimodalEvent multimodalEvent) | | | | | | |
系统类标准化事件
提供处理标准系统事件的方法。标准系统事件包括关闭页面和静音。
| 场景 | 方法 | 键盘 | 鼠标 | 遥控器 | 表冠/旋钮 | 耳机 | | -------- | ---------------------------------------------------- | ------------ | ------ | ------ | --------- | ------ | | 关闭界面 | boolean onClosePage(MultimodalEvent multimodalEvent) | Alt+F4Ctrl+W | 不支持 | 返回键 | 不支持 | 不支持 | | 静音 | boolean onMute(MultimodalEvent multimodalEvent) | 静音键 | 不支持 | 不支持 | 不支持 | 不支持 |
通话类标准化事件
提供处理标准呼叫事件的方法。呼叫事件包括应答、拒绝和挂断呼叫。
| 场景 | 方法 | 键盘 | 鼠标 | 遥控器 | 表冠/旋钮 | 耳机 | | ---- | ------------------------------------------------- | ------ | ------ | ------ | --------- | --------- | | 接听 | boolean onAnswer(MultimodalEvent multimodalEvent) | 不支持 | 不支持 | 不支持 | 不支持 | 单击/长按 | | 拒接 | boolean onRefuse(MultimodalEvent multimodalEvent) | 不支持 | 不支持 | 不支持 | 不支持 | 单击/长按 | | 挂断 | boolean onHangup(MultimodalEvent multimodalEvent) | 不支持 | 不支持 | 不支持 | 不支持 | 单击/长按 |
除了以上标准化事件外,为了提供完整的事件处理能力,多模输入提供按键和触屏事件的回调接口类KeyEventHandle和TouchEventHandle。其处理逻辑为:
- 在收到按键、触屏等原始输入事件时,会优先判断是否需要映射为通用标准化事件(CommonEventHandle),媒体类标准化事件(MediaEventHandle),系统类标准化事件(SystemEventHandle),通话类标准化事件(TelephoneEventHandle)。如果注册了以上四种标准化事件中的一种,且原始输入事件满足该标准事件中某一场景,就会执行该标准化事件提供的回调。
- 如果不需要映射为上述四种标准化事件,则会继续判断是否需要映射为按键标准化事件(KeyEventHandle)和触摸标准化事件(TouchEventHandle)。只要注册了这两种标准化事件,分别执行这两种标准化事件中对应的回调。
- 如果没有注册标准化事件,或者传统输入事件没有对应的标准化事件,则会由Ability继续分发给传统输入事件。
开发者可以根据自己的需求选择是否使用标准化事件。如果标准化事件不能满足需求时,建议使用Java UI框架提供的监听事件进行开发。
说明
不建议开发者同时使用标准化事件、Java UI框架提供的监听事件进行开发,避免增加开发难度。