鸿蒙UI开发——基于组件安全区方案实现沉浸式界面

1、概 述

本文是接着上篇文章 鸿蒙UI开发——基于全屏方案实现沉浸式界面 的继续讨论。除了全屏方案实现沉浸式界面外,我们还可以使用组件安全区的方案。

当我们没有使用setWindowLayoutFullScreen()接口设置窗口为全屏布局时,默认使用的策略就是组件安全区布局方式。即:

【应用在默认情况下窗口背景绘制范围是全屏,但UI元素被限制在安全区内(自动排除状态栏和导航条)进行布局,来避免界面元素被状态栏和导航条遮盖】

示意图如下:

图片

我们将按业务场景去分析基于组件安全区的沉浸式界面的开发。

2、状态栏和导航条颜色相同场景

针对有些APP,状态栏和导航条颜色可能相同,例如如下效果:

图片

针对这种场景,我们可以通过设置窗口的背景色来实现沉浸式效果,设置方式为:setWindowBackgroundColor() 【将窗口的颜色和应用的颜色设置为一致】

Ability中设置window的背景色代码如下(请注意14行代码):

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';import { window } from '@kit.ArkUI';export default class EntryAbility extends UIAbility {  // ...  onWindowStageCreate(windowStage: window.WindowStage): void {    windowStage.loadContent('pages/Index', (err, data) => {      if (err.code) {        return;      }      // 设置全窗颜色和应用元素颜色一致      windowStage.getMainWindowSync().setWindowBackgroundColor('#008000');    });  }}

组件中的背景色设置代码如下(请注意35行代码):

// xxx.ets@Entry@Componentstruct Example {  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')  }}

实现效果如下:

图片

3、状态栏和导航条颜色不同场景

状态栏和导航条颜色不同时,可以使用expandSafeArea属性扩展安全区域属性进行调整。示例代码如下:​​​​​​​

// xxx.ets@Entry@Componentstruct Example {  build() {    Column() {      Row() {        Text('Top Row').fontSize(40).textAlign(TextAlign.Center).width('100%')      }      .backgroundColor('#F08080')      // 设置顶部绘制延伸到状态栏      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])      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('Bottom Row').fontSize(40).textAlign(TextAlign.Center).width('100%')      }      .backgroundColor(Color.Orange)      // 设置底部绘制延伸到导航条      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])    }    .width('100%').height('100%').alignItems(HorizontalAlign.Center)    .backgroundColor('#008000')    .justifyContent(FlexAlign.SpaceBetween)  }}

效果如下:

图片

【扩展安全区域属性原理】

  • 布局阶段按照安全区范围大小进行UI元素布局。

  • 布局完成后查看设置了expandSafeArea的组件边界(不包括margin)是否和安全区边界相交。

  • 如果设置了expandSafeArea的组件和安全区边界相交,根据expandSafeArea传递的属性则进一步扩大组件绘制区域大小覆盖状态栏、导航条这些非安全区域。

  • 上述过程仅改变组件自身绘制大小,不进行二次布局,不影响子节点和兄弟节点的大小和位置。

  • 子节点可以单独设置该属性,只需要自身边界和安全区域重合就可以延伸自身大小至非安全区域内,需要确保父组件未设置clip等裁切属性。

  • 配置expandSafeArea属性组件进行绘制扩展时,需要关注组件不能配置固定宽高尺寸,百分比除外。

4、背景图和视频场景

设置背景图、视频控件大小为安全区域大小并配置expandSafeArea属性。​​​​​​​

// xxx.ets@Entry@Componentstruct SafeAreaExample1 {  build() {    Stack() {      Image($r('app.media.bg'))        .height('100%').width('100%')        .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]) // 图片组件的绘制区域扩展至状态栏和导航条。    }.height('100%').width('100%')  }}

效果图如下:

图片

5、滚动类场景

场景需求:需要List滚动类组件滚动过程中元素可以和导航条重合,滚动至底部时,元素在导航条上面需要避让。示意图如下:

图片

由于expandSafeArea不改变子节点布局,因此,List等滚动类组件可以调用expandSafeArea,延伸List组件视图窗口大小而不改变ListItem内在布局。实现ListItem在滑动过程中显示在导航条下,但滚动至最后一个时显示在导航条上。

开发示例如下:

step 1 : 配置窗口整体底色​​​​​​​

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';import { window } from '@kit.ArkUI';export default class EntryAbility extends UIAbility {  // ...  onWindowStageCreate(windowStage: window.WindowStage): void {    windowStage.loadContent('pages/Index', (err, data) => {      if (err.code) {        return;      }      windowStage.getMainWindowSync().setWindowBackgroundColor('#DCDCDC'); // 配置窗口整体底色    });  }}

step 2 : 界面代码展示​​​​​​​

// xxx.ets@Entry@Componentstruct ListExample {  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  build() {    Column() {      List({ space: 20, initialIndex: 0 }) {        ForEach(this.arr, (item: number) => {          ListItem() {            Text('' + item)              .width('100%')              .height(100)              .fontSize(16)              .textAlign(TextAlign.Center)              .borderRadius(10)              .backgroundColor(0xFFFFFF)          }        }, (item: string) => item)      }      .listDirection(Axis.Vertical) // 排列方向      .scrollBar(BarState.Off)      .friction(0.6)      .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线      .edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring      .width('90%')      // List组件的视窗范围扩展至导航条。      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])    }    .width('100%')    .height('100%')    .padding({ top: 15 })  }}

6、底部页签场景

场景需求:页签背景色能够延伸到导航条区域,但页签内部可操作元素需要在导航条之上。

图片

针对底部的页签部分,Navigation组件和Tabs组件默认实现了页签的延伸处理,我们使用时只需要保证Navigation和Tabs组件的底部边界和底部导航条重合即可。

若我们显式调用expandSafeArea接口,则安全区效果由expandSafeArea参数指定。

如果我们没有使用Navigation和Tab组件而是采用自定义方式实现页签的场景,可以针对底部元素设置expandSafeArea属性实现底部元素的背景扩展。

顶部和底部UI元素未设置和设置expandSafeArea属性效果对比如下:

图片

沉浸式实现代码如下:​​​​​​​

// xxx.ets@Entry@Componentstruct VideoCreateComponent {  build() {    Column() {      Row() {        Text('Top Row').fontSize(40).textAlign(TextAlign.Center).width('100%')      }      .backgroundColor('#F08080')      // 设置顶部绘制延伸到状态栏      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])      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('Bottom Row').fontSize(40).textAlign(TextAlign.Center).width('100%')      }      .backgroundColor(Color.Orange)      // 设置底部绘制延伸到导航条      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])    }    .width('100%').height('100%').alignItems(HorizontalAlign.Center)    .justifyContent(FlexAlign.SpaceBetween)    .backgroundColor(Color.Green)  }}

7、图文场景

当状态栏元素和底部导航条元素不同时,无法单纯通过窗口背景色或者背景图组件延伸实现,此时需要对顶部元素和底部元素分别配置expandSafeArea属性,顶部元素配置expandSafeArea([SafeAreaType.SYSTEM],[SafeAreaEdge.TOP]),底部元素配置expandSafeArea([SafeAreaType.SYSTEM],[SafeAreaEdge.BOTTOM])。

代码如下:​​​​​​​

@Entry@Componentstruct Index {  build() {    Swiper() {      Column() {        Image($r('app.media.start'))          .height('50%').width('100%')          // 设置图片延伸到状态栏          .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])        Column() {          Text('HarmonyOS 第一课')            .fontSize(32)            .margin(30)          Text('通过循序渐进的学习路径,无经验和有经验的开发者都可以掌握ArkTS语言声明式开发范式,体验更简洁、更友好的HarmonyOS应用开发旅程。')            .fontSize(20).margin(20)        }.height('50%').width('100%')        .backgroundColor(Color.White)        // 设置文本内容区背景延伸到导航栏        .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])      }    }    .width('100%')    .height('100%')    // 关闭Swiper组件默认的裁切效果以便子节点可以绘制在Swiper外。    .clip(false)  }}

实现效果如下:

图片

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧税务管理:金融企业报税效率与合规性提升

前言 在数字化浪潮席卷全球的今天,金融行业正面临前所未有的挑战与机遇。如何在复杂的税务环境中保持合规并提高效率,已成为每个金融企业的重中之重。今天小编就为大家介绍一下如何通过借助智能税务平台,实现税务管理的智能化革新&#xff0…

Docker 常用命令全解析:提升对雷池社区版的使用经验

Docker 常用命令解析 Docker 是一个开源的容器化平台,允许开发者将应用及其依赖打包到一个可移植的容器中。以下是一些常用的 Docker 命令及其解析,帮助您更好地使用 Docker。 1. Docker 基础命令 查看 Docker 版本 docker --version查看 Docker 运行…

华为OD机试 - 无向图染色(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

Python+pandas读取Excel将表头为键:对应行为值存为字典—再转json

目录 专栏导读1、库的介绍2、库的安装3、核心代码4、方法1:5、方法2总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自…

摸鱼小工具-窗口隐藏透明

摸鱼小工具-窗口隐藏透明 介绍 就很简单的一个工具,鼠标移上去显示,鼠标离开就透明。具体看图。 源码以及下载地址

vue封装信号强度

图标下载链接: https://pan.baidu.com/s/1828AidkCKU1KTkw1SvBwQg?pwd4k7n 共五格信号 信号5为绿色,信号4为绿色,信号3为黄色,信号2为黄色,信号1为红色,信号0为灰色。 子组件 /components/SignalStrength/index.vu…

使用常数指针作为函数参数

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用setbas…

简易了解Pytorch中的@ 和 * 运算符(附Demo)

目录 1. 基本知识2. 3. * 1. 基本知识 在 PyTorch 中&#xff0c; 和 * 运算符用于不同类型的数学运算&#xff0c;具体是矩阵乘法和逐元素乘法 基本知识 运算符功能适用场景示例矩阵乘法&#xff08;或点乘&#xff09;用于执行线性代数中的矩阵乘法C A B&#xff0c;其中…

VulkanTutorial(8·Shader modules)

Shader modules 与早期的API不同&#xff0c;Vulkan中的着色器代码必须以字节码格式指定&#xff0c;而不是人类可读的语法&#xff0c;如GLSL和HLSL。这种字节码格式称为SPIR-V它是一种可用于编写图形和计算着色器的格式 使用像SPIR-V这样简单的字节码格式&#xff0c;不会面…

读数据工程之道:设计和构建健壮的数据系统23批量获取的考虑因素

1. 批量获取的考虑因素 1.1. 批量获取&#xff0c;通常是获取数据的一种便捷方式 1.1.1. 通过从源系统中抽取一个数据子集&#xff0c;根据时间间隔或累积数据的大小来获取数据 1.2. 基于时间间隔的批量获取在传统ETL的数据仓库中很普遍 1.2.1. 每天在非工作时间&#xff0…

Cyber​​Panel upgrademysqlstatus 远程命令执行漏洞(QVD-2024-44346)

0x01 产品简介 CyberPanel是一个开源的Web控制面板,它提供了一个用户友好的界面,用于管理网站、电子邮件、数据库、FTP账户等。CyberPanel旨在简化网站管理任务,使非技术用户也能轻松管理自己的在线资源。 0x02 漏洞概述 该漏洞源于upgrademysqlstatus接口未做身份验证和…

【形态学 - 击中-击不中变换(很多都讲得不直观不清楚,甚至是错的,我来个通俗易懂的)】

简单描述过程&#xff1a; 一般的目标匹配是&#xff0c;知道目标长什么样&#xff0c;用这个模板去匹配。这里还知道目标周围环境长什么样。 如何把环境的信息加进来用来帮助匹配呢。这个就是击中-击不中联合匹配了。 就是用亮图去匹配目标。 再用暗图去匹配背景。 两个联合起…

【蓝桥杯选拔赛真题78】python电话号码 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python电话号码 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python电话号码 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

单细胞数据分析(四):细胞亚型注释

文章目录 介绍加载R包导入数据细胞簇可视化细胞簇标记基因细胞识别输出结果系统信息介绍 单细胞细胞亚型注释是指在单细胞聚类分析后,对每个聚类得到的细胞群体进行生物学意义上的分类和识别的过程。这一步骤的目的是为了确定每个细胞群体对应的具体细胞类型或状态,从而更好…

CI/CD 的原理

一、CI/CD 的概念 CI/CD是一种软件开发流程&#xff0c;旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。 CI(Continuous Integration)持续集成 目前主流的开发方式是协同开发&#xff0c;即多位开发人员同事处理同意应用不同模块或功能。 如果企业在同一时间将…

常见大气校正模型及6S模型安装部署【20241028】

⛄常见大气校正模型 大气校正是遥感图像标准化处理的重要环节&#xff0c;消除太阳辐射传输过程中大气对于遥感图像的影响&#xff0c;提高影像的清晰度&#xff0c;获取地物真实的光谱信息。由于大气条件较为复杂&#xff0c;且随区域地理分布和观测时间是动态变化的&#xf…

map 和 set 的使用

文章目录 一.序列式容器和关联式容器二. set 系列的使用1. set 和 multiset 参考文档2. set 类介绍3. set 的构造和迭代器4. set 的增删查5. insert 和迭代器遍历使用样例6. find 和 erase 使用样例7. multiset 和 set 的差异 三. map 系列的使用1. map 和 multimap参考文档2. …

区块链可投会议CCF A--ICDE 2025 截止11.25 附2024录用数

Conference&#xff1a; IEEE International Conference on Data Engineering (ICDE) CCF level&#xff1a;CCF A Categories&#xff1a;Database/Data Mining/Content Retrieval Year&#xff1a;2025 Conference time&#xff1a; May 19-23, 2025 录用数&#xff1a;…

SLAM:未来智能科技的核心——探索多传感器融合的无限可

前言 作为2024年刚入学的研一新生&#xff0c;我初步选择了SLAM&#xff08;Simultaneous Localization and Mapping&#xff0c;即同时定位与地图构建&#xff09;作为我的研究方向。虽然在理论学习上已经有了一些基础&#xff0c;但目前的我并没有太多的实践经验。这让我在面…

Black Basta 勒索软件冒充 Microsoft Teams 的 IT 支持人员入侵网络

BlackBasta 勒索软件行动已将其社会工程攻击转移到 Microsoft Teams&#xff0c;伪装成公司帮助台联系员工以协助他们进行正在进行的垃圾邮件攻击。 Black Basta 是一个勒索软件行动&#xff0c;自 2022 年 4 月起活跃&#xff0c;并对全球数百起企业攻击负责。 2022 年 6 月…