鸿蒙ArkUI之相对布局容器(RelativeContainer)实战之狼人杀布局,详细介绍相对布局容器的用法,附上代码,以及效果图

news2025/7/15 13:57:11

在鸿蒙应用开发中,若是遇到布局相对复杂的场景,往往需要嵌套许多层组件,去还原UI图的效果,若是能够掌握相对布局容器的使用,对于复杂的布局场景,可直接减少组件嵌套,且随心所欲完成复杂场景的布局。

官方地址:

RelativeContainer-行列与堆叠-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

 关键属性

RelativeContainer能够帮我们随心所欲完成布局的关键在于,子组件可以通过alignRules这个属性去设置和什么什么组件对齐,通过锚点,去向某一个组件对齐,比如,父组件RelativeContainer()组件,它的锚点必须是:__container__,其他的组件可以通过设置id(接收字符串自定义)的方式来锁定锚点,下面这些参数,就是alignRules属性接收的参数。

名称类型描述
left{ anchor: string, align: HorizontalAlign }

设置左对齐参数。

- anchor:设置作为锚点的组件的id值。

- align:设置相对于锚点组件的对齐方式。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

right{ anchor: string, align: HorizontalAlign }

设置右对齐参数。

- anchor:设置作为锚点的组件的id值。

- align:设置相对于锚点组件的对齐方式。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

middle{ anchor: string, align: HorizontalAlign }

设置横向居中对齐方式的参数。

- anchor:设置作为锚点的组件的id值。

- align:设置相对于锚点组件的对齐方式。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

top{ anchor: string, align: VerticalAlign }

设置顶部对齐的参数。

- anchor:设置作为锚点的组件的id值。

- align:设置相对于锚点组件的对齐方式。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

bottom{ anchor: string, align: VerticalAlign }

设置底部对齐的参数。

- anchor:设置作为锚点的组件的id值。

- align:设置相对于锚点组件的对齐方式。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

center{ anchor: string, align: VerticalAlign }

设置纵向居中对齐方式的参数。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

 用法

下面代码块所示:在RelativeContainer中有一个子组件,它的alignRules设置了顶部对齐RelativeContainer容器的顶部,左边对齐RelativeContainer的左边,为啥是RelativeContainer,因为,对齐的锚点是__contanier__,它就代表RelativeContainer容器,像其他子组件若是要向这个子组件对齐,就可以通过,这个组件绑定的id(img1)作为锚点,设置对齐方式

  
  RelativeContainer() {
     Column({ space: 2 }) {
            Image($r('app.media.nvwu'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('女巫')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img1')
          .alignRules({
            top: { anchor: '__container__', align: VerticalAlign.Top }
          , left: { anchor: '__container__', align: HorizontalAlign.Start }
          })
          .margin({ top: 80, left: 15 })
      }

 像下面这个代码块,img2这个组件,就是相对img1,和RelativeContainer设置的对齐方式

 RelativeContainer() {
          Text('狼人杀')
            .fontSize(20)
            .fontWeight(700)
            .alignRules({
              middle: { anchor: '__container__', align: HorizontalAlign.Center }
            })
            .margin({ top: 20 })
          Column({ space: 2 }) {
            Image($r('app.media.nvwu'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('女巫')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img1')
          .alignRules({
            top: { anchor: '__container__', align: VerticalAlign.Top }
          , left: { anchor: '__container__', align: HorizontalAlign.Start }
          })
          .margin({ top: 80, left: 15 })

          Column({ space: 2 }) {
            Image($r('app.media.langren'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('狼人')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img2')
          .alignRules({
            top: { anchor: 'img1', align: VerticalAlign.Bottom }
          , left: { anchor: '__container__', align: HorizontalAlign.Start }
          })
          .margin({ top: 20, left: 15 })
         }

注意点

加了组件,就必须给它设置对齐方式否则,组件将默认堆积在容器的左上角,组件margin的方向,也会跟着对齐方式的方向走,比如img2的上边,是对着img1的下边,img2的margin({top:10}) 就会对着img1的下边走10vp

完整代码

下面是一个简单的布局,给RelativeContainer的一级子组件都加上了id,也调整了对齐方式,img1到img4的左边,相对RelativeContainer的左边对齐,img5到img8的右边相对于RelativeContainer的右边对齐,img1的顶部相对于RelativeContainer的顶部对齐,img2到img4的顶部相对于前一个img的底部对齐,img5的顶部相对于RelativeContainer的顶部对齐,img6到img8的顶部相对于前一个img的底部对齐。

@Preview
@Component
export struct RelativeContainerCase {
  build() {
    NavDestination() {
      Column({ space: 20 }) {
        RelativeContainer() {
          Text('狼人杀')
            .fontSize(20)
            .fontWeight(700)
            .alignRules({
              middle: { anchor: '__container__', align: HorizontalAlign.Center }
            })
            .margin({ top: 20 })
          Column({ space: 2 }) {
            Image($r('app.media.nvwu'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('女巫')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img1')
          .alignRules({
            top: { anchor: '__container__', align: VerticalAlign.Top }
          , left: { anchor: '__container__', align: HorizontalAlign.Start }
          })
          .margin({ top: 80, left: 15 })

          Column({ space: 2 }) {
            Image($r('app.media.langren'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('狼人')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img2')
          .alignRules({
            top: { anchor: 'img1', align: VerticalAlign.Bottom }
          , left: { anchor: '__container__', align: HorizontalAlign.Start }
          })
          .margin({ top: 20, left: 15 })

          Column({ space: 2 }) {
            Image($r('app.media.lieren'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('猎人')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img3')
          .alignRules({
            top: { anchor: 'img2', align: VerticalAlign.Bottom }
          , left: { anchor: '__container__', align: HorizontalAlign.Start }
          })
          .margin({ top: 20, left: 15 })

          Column({ space: 2 }) {
            Image($r("app.media.pingmin"))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('平民')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img4')
          .alignRules({
            top: { anchor: 'img3', align: VerticalAlign.Bottom }
          , left: { anchor: '__container__', align: HorizontalAlign.Start }
          })
          .margin({ top: 20, left: 15 })

          Column({ space: 2 }) {
            Image($r('app.media.yvyanjia'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('预言家')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img5')
          .alignRules({
            top: { anchor: '__container__', align: VerticalAlign.Top }
          , right: { anchor: '__container__', align: HorizontalAlign.End }
          })
          .margin({ top: 80, right: 15 })

          Column({ space: 2 }) {
            Image($r('app.media.pingmin'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('平民')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img6')

          .alignRules({
            top: { anchor: 'img5', align: VerticalAlign.Bottom }
          , right: { anchor: '__container__', align: HorizontalAlign.End }
          })
          .margin({ top: 20, right: 15 })

          Column({ space: 2 }) {
            Image($r('app.media.langren'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('狼人')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img7')
          .alignRules({
            top: { anchor: 'img6', align: VerticalAlign.Bottom }
          , right: { anchor: '__container__', align: HorizontalAlign.End }
          })
          .margin({ top: 20, right: 15 })

          Column({ space: 2 }) {
            Image($r('app.media.langren'))
              .height(40)
              .width(40)
              .borderRadius(20)
            Text('狼人')
              .fontWeight(700)
              .fontSize(12)
          }
          .id('img8')
          .alignRules({
            top: { anchor: 'img7', align: VerticalAlign.Bottom }
          , right: { anchor: '__container__', align: HorizontalAlign.End }
          })
          .margin({ top: 20, right: 15 })

        }
        .borderRadius(10)
        .backgroundColor('#ccc')
      }
      .justifyContent(FlexAlign.Center)
      .height('100%')
      .width('100%')
    }.height('100%')
    .width('100%')
    .title('展示RelativeContainer')
  }
}


@Builder
function RelativeContainerCaseBuilder() {
  RelativeContainerCase()
}

使用RelativeContainer的好处

对于这种布局,可以使用线性布局来展示,比如:两个Column,或者四个Row,那么用RelativeContainer的好处在哪?

如果使用线性布局,就会多出是组件的嵌套,影响渲染的性能,使用RelativeContainer,可以直接将组件树拍平,提升渲染性能,对于更加复杂的场景,使用RelativeContainer更是可以做到随心所欲布局,只要对照UI设计稿,把控好距离,设置id,我的组件想放那块就放哪块,不需要像线性布局那样考虑如何嵌套才能达到UI效果

 效果展示

 

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

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

相关文章

线程函数库

pthread_create函数 pthread_create 是 POSIX 线程库&#xff08;pthread&#xff09;中的一个函数&#xff0c;用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…

[C]基础13.深入理解指针(5)

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对比 2、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1 代码12.2.2 代码22.2.3 代码32.2.4 …

OpenCV 图形API(60)颜色空间转换-----将图像从 YUV 色彩空间转换为 RGB 色彩空间函数YUV2RGB()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 YUV 色彩空间转换为 RGB。 该函数将输入图像从 YUV 色彩空间转换为 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图像必须是 8…

hbuilderx云打包生成的ipa文件如何上架

使用hbuilderx打包&#xff0c;会遇到一个问题。开发的ios应用&#xff0c;需要上架到app store&#xff0c;因此&#xff0c;就需要APP store的签名证书&#xff0c;并且还需要一个像xcode那样的工具来上架app store。 我们这篇文章说明下&#xff0c;如何在windows电脑&…

Golang | 位运算

位运算比常规运算快&#xff0c;常用于搜索引擎的筛选功能。例如&#xff0c;数字除以二等价于向右移位&#xff0c;位移运算比除法快。

产品动态|千眼狼sCMOS科学相机捕获单分子荧光信号

单分子荧光成像技术&#xff0c;作为生物分子动态研究的关键工具&#xff0c;对捕捉微弱信号要求严苛。传统EMCCD相机因成本高昂&#xff0c;动态范围有限&#xff0c;满阱容量低等问题&#xff0c;制约单分子研究成果产出效率。 千眼狼精准把握科研需求与趋势&#xff0c;自研…

Hot100方法及易错点总结2

本文旨在记录做hot100时遇到的问题及易错点 五、234.回文链表141.环形链表 六、142. 环形链表II21.合并两个有序链表2.两数相加19.删除链表的倒数第n个节点 七、24.两两交换链表中的节点25.K个一组翻转链表(坑点很多&#xff0c;必须多做几遍)138.随机链表的复制148.排序链表 N…

网络:手写HTTP

目录 一、HTTP是应用层协议 二、HTTP服务器 三、HTTP服务 认识请求中的uri HTTP支持默认首页 响应 功能完善 套接字复用 一、HTTP是应用层协议 HTTP下层是TCP协议&#xff0c;站在TCP的角度看&#xff0c;要提供的服务是HTTP服务。 这是在原来实现网络版计算器时&am…

【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析

基于YOLOv5的人脸检测与关键点定位系统深度解析 1. 技术背景与项目意义传统方案的局限性YOLOv5多任务方案的优势 2. 核心算法原理网络架构改进关键点回归分支损失函数设计 3. 实战指南&#xff1a;从环境搭建到模型应用环境配置数据准备数据格式要求数据目录结构 模型训练配置文…

【python】如何将python程序封装为cpython的库

python程序在发布时&#xff0c;往往会打包为cpython的库&#xff0c;并且根据应用服务器的不同架构&#xff08;x86/aarch64&#xff09;&#xff0c;以及python的不同版本&#xff0c;封装的输出类型也是非常多。本文介绍不同架构指定python下的代码打包方式&#xff1a; 首…

计算机组成原理 课后练习

例一&#xff1a; 例二&#xff1a; 1. 原码一位乘 基本原理 原码是一种直接表示数值符号和大小的方式&#xff1a;最高位为符号位&#xff08;0表示正&#xff0c;1表示负&#xff09;&#xff0c;其余位表示数值的绝对值。原码一位乘的核心思想是逐位相乘&#xff0c;并通…

SVN仓库突然没有权限访问

如果svn仓库突然出现无法访问的情况&#xff0c;提示没有权限&#xff0c;所有账号都是如此&#xff0c;新创建的账号也不行。 并且会突然提示要输入账号密码。 出现这个情况时&#xff0c;大概率库里面的文件有http或者https的字样&#xff0c;因为单独给该文件添加权限导致…

【Qt】文件

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; Qt 文件概述 二&#xff1a;&#x1f525; 输入输出设备类 三&#xff1a;&#x1f525; 文件读写类 四&#xff1a;&#x1f525; 文件和目录信息类 五&…

【AI】[特殊字符]生产规模的向量数据库 Pinecone 使用指南

一、Pinecone 的介绍 Pinecone是一个完全托管的向量数据库服务&#xff0c;专为大规模机器学习应用设计。它允许开发者轻松存储、搜索和管理高维向量数据&#xff0c;为推荐系统、语义搜索、异常检测等应用提供强大的基础设施支持。 1.1 Pinecone的核心特性 1. 高性能向量搜…

dstream

DStream转换DStream 上的操作与 RDD 的类似&#xff0c;分为 Transformations&#xff08;转换&#xff09;和 Output Operations&#xff08;输出&#xff09;两种&#xff0c;此外转换操作中还有一些比较特殊的原语&#xff0c;如&#xff1a;updateStateByKey()、transform(…

HFSS5(李明洋)——设置激励(波端口激励)

Magnetic是适用于铁磁氧导体的&#xff0c;只有前三种激励类型可以用于计算S参数 1波端口激励 也可以设置在模型内部&#xff0c;如果是设置在模型内部必须加一段理想导体&#xff0c;用于指定端口方向 1.1——模式 number 输入N&#xff1a;计算1-N的模式都计算 1.2——模式…

ubiquant比赛系列——用docker准备ubipoker开发环境

比赛过程&#xff1a; 环境准备&#xff1a; #在云服务器上拉python官方的docker镜像并下载到本地 https://hub.docker.com/_/python/ sudo docker pull python:3.11.12-slim-bullseye sudo docker images sudo docker save -o 3.11.12-slim-bullseye.tar python:3.11.12-slim…

Rust实现高性能目录扫描工具ll的技术解析

Rust实现高性能目录扫描工具ll的技术解析 一、项目概述 本项目使用Rust构建了一个类ls命令行工具&#xff0c;具备以下核心特性&#xff1a; 多格式文件信息展示并行目录扫描加速人类可读文件大小运行时性能统计交互式进度提示 二、技术架构 1. 关键技术栈 clap&#xff…

深入理解C语言变量:从基础到实践

在编程世界中&#xff0c;变量是最基础也是最重要的概念之一。作为C语言的核心组成部分&#xff0c;变量承载着程序运行时数据的存储和传递功能。理解变量的工作原理和正确使用方法&#xff0c;是成为一名合格C程序员的必经之路。本文将全面介绍C语言变量的各个方面&#xff0c…

RK3562/3588 系列之0—NPU基础概念

RK3562/3588 系列之0—NPU基础概念 1.处理器分类2.算力衡量指标TOPS参考文献 1.处理器分类 中央处理器(CPU)&#xff1b; 图形处理器 (GPU)&#xff1b; 神经网络处理器(NPU)。 每个处理器擅长不同的任务:CPU擅长顺序控制和即时性&#xff1b;GPU适合并行数据流处理,NPU擅长…