HarmonyOS 鸿蒙Next H5实现区域避让开发指导
HarmonyOS 鸿蒙Next H5实现区域避让开发指导
一、概述
在移动应用开发中,不同设备的屏幕形态各异,如刘海屏、全面屏、折叠屏等,同时系统状态栏、导航栏、软键盘等元素也会占据屏幕空间。为了确保应用内容在各种设备和场景下都能正常显示,不被遮挡,H5提供了一系列区域避让的机制。本文将详细介绍 H5 区域避让的实现原理、适配指导以及具体的场景案例。
使用场景
典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条,其中状态栏和导航条,通常在全屏沉浸式布局下称为避让区,避让区之外的区域称为安全区。界面元素在不同设备上存在差异,下面是不同设备上状态栏、挖孔区、导航栏的位置差异,包括:直板机、PAD、PC、折叠屏(阔折叠、双折叠、三折叠)。
说明
下图中标记区域含义:1为状态栏、2为挖孔区、3为导航栏。
图1 直板机界面元素示意图
图2 PAD界面元素示意图
图3 PC界面元素示意图
图4 折叠屏–阔折叠 界面元素示意图(左图展开态 右图折叠态)
图5 折叠屏–双折叠 界面元素示意图(左图折叠态 右图展开态)
图6 折叠屏–三折叠 界面元素示意图(左图折叠态 右图二屏折叠态 下图三屏全展开态)
图7 AvoidArea实现安全布局
图8 AvoidArea实现安全区布局+背景沉浸模式
图9 AvoidArea实现全屏布局+避让场景
图10 sample示例图
面对上述不同设备的避让区差异,可以按照如下三种场景实现应用沉浸式效果:
1.1 安全区布局场景
系统保持安全区内布局,确保应用内容不会延伸到状态栏、导航栏区域。
1.2 安全区布局+背景沉浸模式
系统保持安全区内布局,然后延伸绘制内容(如背景色、背景图)到状态栏和导航栏区域,实现沉浸式效果。
1.3 全屏布局+避让场景
系统保持全屏布局,通过相关接口获取避让区域位置、大小等信息,调整元素位置,确保不会被避让区遮挡。
二、区域避让实现原理
区域避让主要通过原生接口提供的能力实现,该接口包含几个核心方法,用于处理与区域避让相关的操作。
-
avoidAreaListener():该方法用于添加系统规避区变化事件的监听。通过监听"avoidAreaChange"参数,当系统规避区发生变化时,如软键盘弹出或收起、设备旋转等,会触发相应的回调函数,在回调中通过 runJavaScript() 的方法将变化的数据传递给H5页面。
-
registerJavaScriptProxy():注入JavaScript对象到window对象中,并在window对象中调用该对象的方法。实现H5页面调用原生方法。
-
getAvoidArea():Plugins 类中的 getAvoidArea() 接口负责获取系统默认避让区域信息。此方法接收一个 AvoidAreaType 类型的参数,通过该参数可以获取当前应用窗口内容需要规避的区域。这些区域可能包括系统栏、刘海屏、手势操作区、软键盘等与窗口内容重叠时需要避让的区域。通过原生接口获取窗口实例,然后调用窗口的 getWindowAvoidArea 方法获取相应类型的避让区域,接口返回信息中包含对应避让区域是否可见、位置信息及宽高信息,并将结果返回给 H5 端。
三、适配指导
下面以VUE3框架为例,从上述的三个主要场景来进行适配指导。
3.1 安全区布局场景
安全区布局场景主要是为了确保应用内容不会被系统状态栏、导航栏等遮挡。
图7 AvoidArea实现安全布局
该场景有两种实现方法:
-
webview在安全区布局,H5页面不需要做额外处理。应用内组件默认避让状态栏、导航栏。
-
webview全屏布局,H5获取状态栏、导航栏高度,设置padding。
3.2 安全区布局+背景沉浸模式
在安全区域布局的基础上,延伸绘制内容(如背景色、背景图)到状态栏和导航条区域,实现沉浸式效果。实现方式与安全区布局相似,将webview设置全屏沉浸式,H5背景全屏、内容设置padding。
图8 AvoidArea实现安全区布局+背景沉浸模式
3.3 全屏布局+避让场景
在全屏布局中,需要隐藏系统状态栏和导航栏,并添加避让区域变化监听。根据避让区域的变化动态调整布局,确保应用在各种情况下都能正常显示。
图9 AvoidArea实现全屏布局+避让场景
3.3.1 原生侧开启全屏布局
在HarmonyOS工程的EntryAbility.ets文件中的onWindowStageCreate()生命周期内:
- setWindowLayoutFullScreen()接口实现界面元素延伸到状态栏和导航区域;
- 再通过setWindowSystemBarEnable()接口将主窗口状态栏和底部导航条隐藏,实现页面的全屏布局。
3.3.2 注入JavaScript对象
使用registerJavaScriptProxy() 接口将原生侧方法注入到H5页面中,H5页面可以调用原生方法获取状态栏和导航区域高度。
3.3.3 在H5页面中计算刘海屏/挖孔区位置
页面通过调用原生方法获取刘海屏区域位置,通过计算转换成相对位置和避让的数值。
3.3.4 H5页面示例代码
页面通过调用原生方法获取避让区域,并监听避让区域变化事件,根据回调设定不同区域的样式,实现避让。
四、场景案例
4.1 全屏布局+避让场景案例
- 以VUE3为例,通过调用 getAvoidArea() 接口获取初始化时的避让区域信息,并监听通过 addAvoidAreaListener() 接口注册的监听器发送的事件 ‘statusBarChange’,以便在状态变化时(如横竖屏转换)更新区域避让信息。
- 利用获取到的区域避让信息数据,计算所需避让的区域及其边距,并相应地更新 UI。
五、示例代码
H5区域避让的Sample示例代码地址:avoid_area_sample,开发者可以通过该地址查看完整的区域避让示例代码,并根据自己的需求进行修改和扩展。
更多关于HarmonyOS 鸿蒙Next H5实现区域避让开发指导的实战教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS Next中实现H5区域避让可通过以下方式:
- 使用Web组件加载H5页面
- 通过Web组件的onTouchEvent回调监听触摸区域
- 利用getBoundingClientRect()获取H5元素位置信息
- 使用HarmonyOS的避让区域API(如setAvoidArea)设置系统避让区域
- 在H5侧通过CSS媒体查询适配避让区域
关键代码示例:
webView.onTouchEvent((event) => {
const avoidArea = calculateAvoidArea(event);
window.setAvoidArea(avoidArea);
});
注意避让区域坐标需转换为物理像素值。此方案适用于系统UI与H5内容重叠时的自动避让场景。
更多关于HarmonyOS 鸿蒙Next H5实现区域避让开发指导的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中实现H5区域避让,核心是通过原生接口获取避让区域信息并动态调整布局。以下是关键点总结:
核心接口:
avoidAreaListener()
:监听系统规避区变化(如键盘弹出/收起、屏幕旋转)getAvoidArea()
:获取当前需要避让的区域信息(状态栏/导航栏/刘海区等)registerJavaScriptProxy()
:实现H5与原生通信
三种适配方案:
- 安全区布局:默认避让系统UI区域
- 安全区+背景沉浸:内容在安全区,背景延伸到系统区域
- 全屏布局+动态避让:通过监听规避区变化动态调整元素位置
关键实现步骤:
- 原生侧:设置全屏模式(
setWindowLayoutFullScreen
) - 注入JS对象到H5环境
- H5侧:监听规避区变化事件,动态计算
padding
/margin
- 处理折叠屏等特殊场景的状态变化
示例代码:
提供了完整的Vue3示例,包含规避区计算、事件监听和动态样式调整的实现。
建议参考提供的Sample代码进行具体实现,特别注意折叠屏状态变化时的布局重计算。