Table of Contents
一、安全区域
安全区域定义为页面的显示区域,其默认不与系统设置的非安全区域(如状态栏、导航栏)重叠,以确保开发者设计的界面均布局于安全区域内。然而,当Web组件启用沉浸式模式时,网页元素可能会出现与状态栏或导航栏重叠的问题。具体示例如图1所示,中间部分的区域即为安全区域,而顶部状态栏、屏幕挖孔区域和底部导航条则被界定为避让区,Web组件开启沉浸式效果时,网页内底部元素与导航条发生重叠。
提供属性方法允许开发者设置组件绘制内容突破安全区域的限制,通过expandSafeArea属性支持组件不改变布局情况下扩展其绘制区域至安全区外,通过设置setKeyboardAvoidMode来配置虚拟键盘弹出时页面的避让模式。页面中有标题栏等文字不希望和非安全区重叠时,建议对组件设置expandSafeArea属性达到沉浸式效果,也可以直接通过窗口接口setWindowLayoutFullScreen设置沉浸式。
说明
默认摄像头挖孔区域不为非安全区域,页面不避让挖孔。
从API Version 12开始,可在module.json5中添加配置项, 摄像头挖孔区域视为非安全区,实现页面默认避让挖孔:
二、expandSafeArea属性
控制组件扩展其安全区域。
三、软键盘避让模式
当用户在输入时,为了确保输入框不会被键盘遮挡,系统提供了避让模式来解决这一问题。开发者可以通过setKeyboardAvoidMode控制虚拟键盘抬起时页面的避让模式,避让模式有上抬模式和压缩模式两种,键盘抬起时默认页面避让模式为上抬模式。
1、设置虚拟键盘抬起时页面的避让模式
2、获取虚拟键盘抬起时的页面避让模式
四、相关示例
1、实现沉浸式效果
通过设置expandSafeArea属性向顶部和底部扩展安全区实现沉浸式效果。
2、滚动列表底部延伸场景
在列表滚动场景中,滚动时内容可与导航条区域重合,滚动到底部时,底部内容需避让导航条。
设置列表组件List组件的expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]),扩展列表底部到安全区域。此时List组件显示区域扩大,滚动时列表内容可在导航条区域显示。
// FaqList.ets
将滚动到底部的提示添加在列表项末尾,由于设置expandSafeArea属性不影响子组件的布局,所以滚动到底部时提示文字默认会避让导航条。
常见效果 | 运行效果 |
---|---|
![]() |
![]() |
3、重要信息被软键盘遮挡
例如下面这个电子邮件的示例,内容由三部分组成:标题栏、内容区域和底部操作栏。当点击输入内容的输入框,软键盘会挡住底部的操作栏,影响用户体验,如下图所示:
开发者可以通过设置软键盘的避让模式为KeyboardAvoidMode.RESIZE(压缩模式),来解决底部操作栏被遮挡的问题,设置该属性后,软键盘的避让会通过压缩内容区域的高度来实现。示例代码如下:
4、软键盘弹出导致布局错位
例如下面这样的一个聊天界面,顶部是一个自定义的标题,下方为可滚动聊天消息区域,底部是消息输入框。但是由于软键盘避让默认是上抬模式,会把整个页面向上抬起,所以标题也会被顶上去,如下图所示。现在需求希望顶部标题固定,点击底部输入框软键盘弹起的时候,标题不上抬,只有内容区域上抬。
需要给对应的组件设置 .expandSafeArea([SafeAreaType.KEYBOARD])}属性,使标题组件不避让键盘,示例代码如下:
- 先设置窗口为全屏模式。
// EntryAbility.ets
- 再设置标题组件不避让键盘
// ContactPage.ets
5、自定义弹窗被键盘顶起
在软键盘系统避让机制中介绍过,弹窗为避让软键盘会进行避让,整体向上抬,这样可能会影响用户体验。比如下面这个评论里列表的弹窗,使用@CustomDialog实现的。当用户点击弹窗底部的输入框的时候,弹窗会整体上抬,输入框上抬的距离也过多。
为了解决以上问题,可以使用Navigation.Dialog,通过设置NavDestination的mode为NavDestinationMode.DIALOG弹窗类型,此时整个NavDestination默认透明显示,示例代码如下:
// NavDestinationModeDemo.ets
此外还需要设置软键盘避让模式为压缩模式,示例代码如下:
// EntryAbility.ets
一键三连+关注,你的支持是我创作的动力。在这里,我乐于倾囊相授。