HarmonyOS 鸿蒙Next中H5交互事件归一开发指导
HarmonyOS 鸿蒙Next中H5交互事件归一开发指导
一、概述
在移动应用开发中,悬浮、点击、双击、长按、上下文菜单、拖拽、轻扫、滚动/平移、缩放和旋转这10种交互事件,在不同的移动端设备上可以分别由触控屏、触控板或键鼠这三类输入设备的不同操作方式触发。使用交互归一组件,保证不同交互场景下的体验一致性,开发者只需要调用归一后的交互事件接口,无需为每种输入设备单独适配,从而大幅简化开发流程。本文将详细介绍 H5交互归一组件库实现交互归一开发、适配指导以及具体的场景案例。
使用场景
音乐播放器的列表页面以及播放详情页体现10种交互事件。
表1
手机端 | PC端 |
---|---|
NA | 光标移动到元素上 |
单指点击 | 单指轻点/单指按压 |
单指双击 | 轻点两下/按压两下 |
单指长按 | 单指按压 |
单指长按 | 双指轻点/按压或单指长按 |
单指长按并移动 | 按压并滑动以拖动 |
单指快速滑动 | 双指快速移动 |
单指滑动 | 双指移动 |
双指捏合或张开 | 双指捏合或张开 |
NA | NA |
二、交互归一能力分析
web_uni_input
交互归一组件库,提供10种交互事件,根据不同属性事件实现不同交互能力。
表2
输入 | 触控屏 | 触控板 | 鼠标 | 封装原理 |
---|---|---|---|---|
悬浮 | NA | 光标移动到元素上 | 光标移动到元素上 | 监听 pointerover 、pointerout 把 event 原生对象透传给 onHover 。监听 pointermove 把原生 event 对象透传给 onHoverMove 。 |
单击 | 单指点击 | 单指轻点/单指按压 | 单击鼠标左键 | 监听 pointerdown 、pointerup 把原生 event 重新封装透传给 onClick 。 |
双击 | 单指双击 | 轻点两下/按压两下 | 双击左键 | 监听 pointerdown 、pointerup 把原生 event 对象重新封装透传给 onDoubleClick 。 |
长按 | 单指长按 | 单指按压 | 长按左键 | 监听 pointerdown 把原生 event 对象重新封装透传给 onLongPressStart 。监听 pointerup 、把原生 event 对象重新封装透传给 onLongPressEnd 。监听 pointercancel 把原生 event 对象重新封装透传给 onLongPressCancel 。 |
上下文菜单 | 单指长按 | 双指轻点/按压或单指长按 | 单击右键 | 监听 contextmenu 把原生 event 对象透传给 onContextMenu 。 |
拖拽 | 单指长按并移动 | 按压并滑动以拖动 | 按压左键并移动鼠标 | 监听 dragstart 、dragenter 、dragover 、dragleave 、drop 把原生 event 对象透传给 onDragstart 、onDragEnter 、onDragMove 、onDragLeave 、onDrop 。 |
轻扫 | 单指快速滑动 | 双指快速移动 | 滚动一格或快速滚动后停止 | PC:监听 wheel 把原生 event 对象重新封装透传给 onSwipe 。移动端:监听 pointerdown 、pointerup 把原生 event 对象重新封装透传给 onSwipe 。 |
滚动/平移 | 单指滑动 | 双指移动 | 滚轮/滚轮+shift | PC:监听 wheel 把原生 event 对象重新封装透传给 onScroll 。移动端:监听 pointerdown 、pointerup 把原生 event 对象重新封装透传给 onScroll 。 |
缩放 | 双指捏合或张开 | 双指捏合或张开 | ctrl+滚动滚轮 | PC: 监听 wheel+Ctrl 把原生 event 对象重新封装透传给 onPinchStart 、onPinchMove 、onPinchEnd 。移动端:监听 touchstart 、touchmove 、touchend 把原生 event 对象重新封装透传给 onPinchStart 、onPinchMove 、onPinchEnd 。 |
旋转 | 双指互相以对方为中心旋转 | NA | NA | 监听 touchstart 、touchmove 、touchend 把原生 event 对象重新封装透传给 onPinchStart 、onPinchMove 、onPinchEnd 。 |
1、悬浮事件
图3
主要方法
- onHover:悬浮进入或退出事件。
- onHoverMove:悬浮事件,在onHoverMove方法实现悬浮的具体效果。
2、点击和双击事件
表3
手机端 | PC端 |
---|---|
![]() |
![]() |
主要方法
- onClick:单击事件,在onClick方法实现单击具体操作。
- onDoubleClick:双击事件,在onDoubleClick方法实现双击具体操作。
3、长按事件
表4
手机端 | PC端 |
---|---|
![]() |
![]() |
主要方法
- onLongPressStart:长按开始事件,在onLongPressStart方法实现长按的具体操作。
- onLongPressEnd:长按结束事件。
- onLongPressCancel:长按取消事件,在onLongPressCancel方法实现长按取消的具体操作。
4、上下文菜单事件
图8
主要方法
- onContextMenu:下拉菜单功能,鼠标或者触控点位置存在的情况下,显示上下文菜单UI效果。
5、拖拽事件
表5
手机端 | PC端 |
---|---|
![]() |
![]() |
主要方法
- onDragStart:拖拽开始事件,绑定A组件,在触控屏上长按并移动或长按鼠标左键并移动触发。
- onDragEnter:拖拽进入事件,绑定B组件,进入B组件时触发。
- onDragMove:拖拽移动事件,绑定B组件,在B组件移动时触发。
- onDragLeave:拖拽离开事件,绑定B组件,离开B组件时触发。
- onDrop:拖拽结束事件,松开鼠标左键或手指在触控屏抬起触发。
6、轻扫事件
图11
主要方法
- onSwipe:轻扫事件,onSwipe和onScroll不要同时使用,会存在冲突。
7、滚动/平移事件
表6
手机端 | PC端 |
---|---|
![]() |
![]() |
主要方法
- onScroll:滚动事件,PC端根据滚轮的滚动或者手机端根据手势的移动进行触发,以此实现相应的滚动效果。
8、缩放事件
图14
主要方法
- onPinchStart:缩放开始事件,在执行这个事件会默认禁止旋转事件。
- onPinchMove:缩放中事件,通过event.scale缩放比例判断是放大还是缩小。
- onPinchEnd:缩放结束事件,默认放开旋转事件。
9、旋转事件
图15
主要方法
- onRotateStart:旋转开始事件,在执行这个事件会默认禁止缩放事件。
- onRotateMove:旋转中事件,通过event.angle旋转角度判断是正向旋转还是逆向旋转。
- onRotateEnd:旋转结束事件,默认放开缩放事件。
三、PC按键控制(非手势库)
图16
示例说明
通过 document.addEventListener('keyup', (event) => { })
监听键盘行为。
document.addEventListener("keyup", (event) => {
switch (event.key) {
case "ArrowUp":
// 上键:切换歌曲为上一曲
break;
case "ArrowDown":
// 下键:切换歌曲为下一曲
break;
case "ArrowLeft":
// 左键:控制播放器快退5s播放
break;
case "ArrowRight":
// 右键:控制播放器快进5s播放
break;
case "Enter":
// enter:当歌曲暂停状态时,按下enter键歌曲开始播放
break;
case "Escape":
// esc:回到上一级页面
break;
case " ":
// 空格:当歌曲播放状态时,按下空格键歌曲暂停
break;
}
});
四、示例代码
sample地址:uni_input_sample,开发者可以通过该地址查看完整的交互事件归一示例代码,并根据自己的需求进行修改和扩展。
更多关于HarmonyOS 鸿蒙Next中H5交互事件归一开发指导的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,H5交互事件归一通过@ohos.web.webview
提供统一接口。使用WebView
组件加载H5页面时,可通过onConfirm
、onAlert
等回调处理弹窗事件,通过onMessage
接收JS消息。JS侧调用window.ohosWebview.postMessage()
发送数据。Native与H5通信需配置domStorageAccess
和javaScriptAccess
为true。事件处理需在主线程执行,避免阻塞UI。具体API见ArkTS声明文件webview.d.ts
。
在HarmonyOS Next中实现H5交互事件归一化开发,可以显著提升跨设备体验一致性。以下是关键要点:
-
核心组件 使用
@hadss/web_uni_input
库提供的PointerGestureManager组件,通过统一API处理10种交互事件(悬浮、点击、双击、长按等),无需区分触控屏/触控板/键鼠输入方式。 -
典型实现模式
// Vue3示例
import { PointerGestureManager } from "@hadss/web_uni_input";
const handlers = {
onClick: (state) => { /* 处理点击 */ },
onLongPressStart: (state) => { /* 长按开始 */ }
};
const configs = {
enableClick: true,
enableLongPress: true
};
PointerGestureManager(element, handlers, configs);
- 设备差异处理
- 悬浮事件:PC端通过pointerover/pointermove,移动端无响应
- 拖拽事件:移动端长按触发,PC端鼠标拖动
- 缩放事件:移动端双指手势,PC端Ctrl+滚轮
- 特殊注意事项
- 缩放和旋转事件互斥(默认缩放时禁用旋转)
- onSwipe和onScroll避免同时使用
- 通过event.scale/angle参数获取手势强度
- PC键盘扩展 可通过keyup事件监听实现媒体控制:
document.addEventListener('keyup', (e) => {
if(e.key === 'ArrowUp') // 上一曲
if(e.key === ' ') // 空格暂停
});
该方案已通过音乐播放器案例验证,完整示例代码可参考OpenHarmony官方示例库。