HarmonyOS 开发应用沉浸式效果

news/2025/11/27 13:02:55/文章来源:https://www.cnblogs.com/xiaokangzhao/p/19277091

开发应用沉浸式效果

概述

典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条,其中状态栏和导航条,通常在沉浸式布局下称为避让区;避让区之外的区域称为安全区。开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感,从而使用户获得最佳的UI体验。

图1 界面元素示意图

沉浸式页面开发通常分为以下两步:

  1. 实现沉浸式效果。

    • 方案一:使用Window.setWindowLayoutFullScreen()方法设置窗口为全屏模式。

    隐藏状态栏

    避让状态栏

    • 方案二:设置组件的expandSafeArea属性,扩展组件的安全区域到状态栏和导航栏,从而实现沉浸式。
  2. 处理避让区域和页面内容的适配问题。

    由于避让区本身是有内容展示,如状态栏中的电量、时间等系统信息,或是手势交互,如导航条点击或上滑,在实现应用页面沉浸式效果后,往往会和避让区域产生UI元素的遮挡、视觉上的违和或交互上的冲突等问题,开发者可以针对不同场景选择以下方式对避让区和应用页面进行适配。

    • 使用Window.setWindowSystemBarEnable()方法或Window.setSpecificSystemBarEnabled()方法设置状态栏和导航栏的显隐。
    • 使用Window.setWindowSystemBarProperties()方法设置状态栏和导航栏的样式。
    • 使用Window.getWindowAvoidArea()方法获取避让区域的高度,据此设置应用页面内容的上下padding实现避让状态栏和导航栏。
    • 使用Display.getCutoutInfo()方法获取挖孔区域宽高和位置信息,设置对应避让元素的margin实现挖孔区避让。
@Entry
@Component
struct Index {build() {Column() {Row() {Text('ROW1').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW2').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW3').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW4').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW5').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW6').fontSize(40)}.backgroundColor(Color.Orange).padding(20)}.width('100%').height('100%').alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.SpaceBetween).backgroundColor('#008000')}
}

窗口全屏布局方案

1.调用setWindowLayoutFullScreen()接口设置窗口全屏

2.使用getWindowAvoidArea()接口获取当前布局遮挡区域(例如状态栏、导航条)。

3.注册监听函数,动态获取避让区域的实时数据。常见的触发避让区回调的场景如下:应用窗口在全屏模式、悬浮模式、分屏模式之间的切换;应用窗口旋转;多折叠设备在屏幕折叠态和展开态之间的切换;应用窗口在多设备之间的流转。

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');}onDestroy(): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');}onWindowStageCreate(windowStage: window.WindowStage): void {// Main window is created, set main page for this abilityhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');// ....// ....// ....// ✅✅✅✅✅// 获取应用主窗口const windowClass: window.Window = windowStage.getMainWindowSync();// 窗口全屏布局方案windowClass.setWindowLayoutFullScreen(true)// 方案1:// windowClass.setSpecificSystemBarEnabled('status', false)// windowClass.setSpecificSystemBarEnabled('navigationIndicator', false)// 方案2// 获取布局避让遮挡的区域const topRectHeight = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM).topRect.height;  // 状态栏区域高度AppStorage.setOrCreate('topRectHeight', topRectHeight);const bottomRectHeight = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR).bottomRect.height;  // 导航条区域的高度AppStorage.setOrCreate('bottomRectHeight', bottomRectHeight);// 注册监听函数,动态获取避让区域数据windowClass.on('avoidAreaChange', (data) => {if (data.type === window.AvoidAreaType.TYPE_SYSTEM) {AppStorage.setOrCreate('topRectHeight', data.area.topRect.height);} else if (data.type == window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR) {AppStorage.setOrCreate('bottomRectHeight', data.area.bottomRect.height);}});// ....// ....

4.布局中的UI元素需要避让状态栏和导航条,对控件顶部设置padding(具体数值与状态栏高度一致),实现对状态栏的避让;对底部设置padding(具体数值与底部导航条区域高度一致),实现对底部导航条的避让。

@Entry
@Component
struct Test2 {@StorageProp('bottomRectHeight')  bottomRectHeight: number = 0;@StorageProp('topRectHeight')  topRectHeight: number = 0;build() {Column() {Row() {Text('ROW1').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW2').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW3').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW4').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW5').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW6').fontSize(40)}.backgroundColor(Color.Orange).padding(20)}.width('100%').height('100%').alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.SpaceBetween).backgroundColor('#008000')// top数值与状态栏区域高度保持一致;bottom数值与导航条区域高度保持一致.padding({ top: px2vp(this.topRectHeight), bottom: px2vp(this.bottomRectHeight) })}
}
  • 也可以单独组建设置全屏
import { window } from '@kit.ArkUI'@Entry
@Component
struct Test2 {async aboutToAppear() {const win = await window.getLastWindow(getContext())win.setWindowLayoutFullScreen(true)}build() {Column() {Row() {Text('ROW1').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW2').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW3').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW4').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW5').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW6').fontSize(40)}.backgroundColor(Color.Orange).padding(20)}.width('100%').height('100%').alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.SpaceBetween).backgroundColor('#008000')}
}

组件安全区方案

@Entry
@Component
struct Test2 {build() {Column() {Row() {Text('ROW1').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW2').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW3').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW4').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW5').fontSize(40)}.backgroundColor(Color.Orange).padding(20)Row() {Text('ROW6').fontSize(40)}.backgroundColor(Color.Orange).padding(20)}.width('100%').height('100%').alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.SpaceBetween).backgroundColor('#008000').expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])}
}

键盘避让

压缩、上抬

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-expand-safe-area#示例6切换避让模式

import { hilog } from '@kit.PerformanceAnalysisKit';
import { KeyboardAvoidMode } from '@kit.ArkUI';
@Entry
@Componentstruct KeyboardAvoidExample3 {build() {Column() {Row({space:15}) {Button('OFFSET').onClick(() => {this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET);hilog.info(0x0000, 'keyboardAvoidMode: %{public}s', JSON.stringify(this.getUIContext().getKeyboardAvoidMode()));}).layoutWeight(1)Button('RESIZE').onClick(() => {this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE);hilog.info(0x0000, 'keyboardAvoidMode: %{public}s', JSON.stringify(this.getUIContext().getKeyboardAvoidMode()));}).layoutWeight(1)Button('NONE').onClick(() => {this.getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.NONE);hilog.info(0x0000, 'keyboardAvoidMode: %{public}s', JSON.stringify(this.getUIContext().getKeyboardAvoidMode()));}).layoutWeight(1)}.height("30%").width("100%").backgroundColor(Color.Gray)TextArea().width("100%").borderWidth(1)Text("I can see the bottom of the page").width("100%").textAlign(TextAlign.Center).backgroundColor('rgb(179,217,235)').layoutWeight(1)TextArea().width("100%").borderWidth(1)}.width('100%').height("100%")}
}

鸿蒙开发者班级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/978350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 属性动画.animation()

基础使用 - 1. 属性动画响应式(确定谁加动画) @State scaleX: number = 1 @State scaleY: number = 1Text().width(50).height(50).backgroundColor(Color.Red).scale({ x: this.scaleX, y: this.scaleY })- 2. 触发…

HarmonyOS游戏开发入门:用ArkTS打造经典五子棋

​ 引言 五子棋是一款经典的策略游戏,规则简单但乐趣无穷。本文将带你使用 HarmonyOS 的 ArkUI 框架,以组件化的思想快速实现一个双人对战的五子棋游戏。我们将逻辑与 UI 分离,打造一个结构清晰、易于维护的应用。 …

详细介绍:【论文阅读】AAAI 2025 | 面向精确分割式联邦学习的多模型聚合与知识重放

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Harmony ArkTS 并发编程全攻略:从基础概念到多线程实战,彻底搞懂性能优化

计算机基础概念在日常的生活或工作中,计算机几乎无处不在,特别是对于我们高级开发攻城狮来说、每天都要使用、来开发各种各样的程序,所以为了能够写出更好的程序、了解计算机基础知识是必要的,接下来就让我们来聊聊…

HarmonyOS文件操作进阶:上传/下载/解压全场景实战(含封装工具类)

​ 一、文件上传:从基础到企业级方案 文件上传是鸿蒙应用开发的核心场景(如头像上传、附件提交、图片分享),鸿蒙基于沙箱安全机制,要求上传文件必须先存入应用沙箱目录(cacheDir),再通过系统 API 提交。以下是…

HarmonyOS 文件操作不用愁:沙箱机制解析 + 可抄代码,零基础上手

一、应用沙箱:鸿蒙应用的 “安全文件柜”​核心简介​应用沙箱是鸿蒙系统为保障数据安全设计的隔离存储机制,每个应用都会获得专属的 “沙箱目录”,实现三大核心目标:​ 数据隔离:应用仅能访问自身文件和少量必需…

HarmonyOS ArkTS 状态管理 V2 全解析:新装饰器 + 实战示例 + 面试题(简述方便新手快速了解使用)

​ 鸿蒙 ArkTS 状态管理 V2 带来了一系列全新装饰器,不仅解决了 V1 版本中装饰器混淆、观测能力有限等问题,还强化了语义化和性能优化。本文将详细拆解@Local、@Param、@ObservedV2等核心装饰器,结合实战代码和对比…

2025最新机械密封件制造厂家实力榜!国内顶尖机械密封品牌权威发布,技术与服务双重保障,机械密封/机械密封件/釜用机械密封/双端面机械密封/机械密封维修品质与专业深度剖析,选择指南

随着工业设备对密封性能要求的不断提高,机械密封作为关键零部件,其质量与可靠性直接关系到生产安全与效率。本榜单基于技术研发实力、产品应用范围、服务响应速度三大维度,结合行业权威数据及用户反馈,对2025年国内…

八皇后

也是深搜实现,进去看看这条路可以走吗 #include <bits/stdc++.h> using namespace std; int ans=0; int m[50]; int mm[50]; int j[50]; int arr[50]; int n; void print() {if(ans>=3) return;for(int i=1;…

机器学习如何优化MRI扫描速度与质量

研究人员利用深度学习技术改进MRI扫描流程,通过随机采样和生成模型实现快速图像重建,减少患者扫描时间同时提升影像质量,该技术已在实际医疗场景中进行测试。机器学习如何优化MRI扫描速度与质量 对许多患者而言,磁…

【日记】买了几个手办(270 字)

正文今天比昨天睡得好,好耶 w。今天下单了几个盗版手办,这样一来我的机箱就不缺什么了。至于为什么是盗版…… 因为正版我买不起,哭哭。银河那边入金了一万,余额宝每天快速转账限额只有一万块钱,所以要达到入金要…

linux系统下独立声卡继电器总是自动反复吸合

在Linux系统下PCIe独立声卡出现反复吸合(不断断开又重连)的情况,确实挺让人头疼的。这个问题通常和电源管理、驱动兼容性或系统音频服务有关。别担心,我们可以一步步来排查。编辑ALSA基础配置文件:sudo nano /etc…

2025年有实力便携式烟灰缸定制/迷你便携式烟灰缸品牌厂家排行榜

2025年有实力便携式烟灰缸定制/迷你便携式烟灰缸品牌厂家排行榜 行业背景与市场趋势 随着全球控烟政策的推进与消费者环保意识的提升,便携式烟灰缸作为细分领域的刚需产品,市场潜力持续释放。据《2024年全球烟具行…

2025年3200度石墨化炉、卧式石墨化炉、碳纤维石墨化炉品

为帮助电池材料、碳纤维等行业企业精准筛选适配生产需求的高温石墨化炉设备,避免选型失误导致的产能损失与成本浪费,我们从设备核心性能(如极限温度稳定性、材料纯度控制精度)、行业场景适配性(针对负极材料/碳纤…

2025年度空调减震器制造企业排名:空调减震器制造企业选择哪

本榜单基于行业深度调研与真实用户反馈,围绕技术实力、产品质量、服务能力三大核心维度筛选出五家标杆企业,为有减震需求的客户提供客观参考,助力精准匹配专业供应商。 TOP1 推荐:河北亦辰减震器制造有限公司 推荐…

2025最新机械密封企业推荐!行业标杆企业权威榜单发布,技术与服务双优助力工业密封安全

随着工业制造领域对设备密封性能要求的不断提升,机械密封作为关键部件,其质量与可靠性直接关系到生产安全与效率。本榜单基于技术创新力、产品多样性、服务覆盖度三大维度,结合行业协会数据及市场反馈,权威解析202…

2025褪黑素哪个牌子好?7大品牌实测排行榜:入睡困难、失眠多梦人群必选

现代人群睡眠健康问题持续凸显:《2025 中国睡眠质量白皮书》数据显示,68.3% 的国人存在不同程度睡眠障碍,其中 49.2% 的成年人入睡时长超 52 分钟,39.6% 的人群每周夜间惊醒≥3 次,27.9% 因失眠导致深度睡眠占比不…

2025年11月建设工程律所评测榜:十家优质律所多维度对比分析

建设工程领域作为国民经济的支柱产业,其项目周期长、涉及主体多、法律关系复杂的特点,使得专业法律服务需求日益凸显。根据最新发布的行业白皮书显示,2025年我国建设工程市场规模持续扩大,但与此同时,工程合同纠纷…

2025年11月休闲食品品牌推荐榜:权威评测与消费者口碑全面解析

休闲食品作为现代人日常生活中不可或缺的一部分,其市场需求持续增长。无论是忙碌工作间隙的能量补充,还是家庭聚会时的休闲享受,或是年轻人社交分享的时尚选择,休闲食品都扮演着重要角色。根据最新发布的行业白皮书…