Android视角看鸿蒙第十二课-鸿蒙的布局之相对布局RelativeContainer

Android视角看鸿蒙第十二课-鸿蒙的布局之相对布局RelativeContainer

导读

相对布局和线性、层叠布局一样都是类似于Android布局的,之前两篇文章已经了解线性、层叠布局的使用方法,这篇文章一起来学习下鸿蒙中的相对布局。

之前的文章中,我偶然提起过,我不太喜欢使用相对布局。

我思考了下为什么会有这种想法呢?
相对布局写起来太麻烦了

Android中虽然可以使用Xml来设置UI,然而相对linearlayout和FrameLayout,至少要多写2条依赖属性,比如是在哪个组件的右侧,在那个组件的下方,而Linear或者Frame不用
相对布局阅读成本高

linearlayout和FrameLayout在阅读代码的时候,组件的层级一目了然,相对布局则需要阅读每个组件的依赖关系
相对布局需要设置每个锚点的ID

Android中相对布局是通过ID来设置依赖关系的,有的组件本身不需要被JAVA代码调用,比如只是个分割线,但因为有组件需要依赖他,则必须设置ID。不够简洁,起ID也费脑子

个人拙见,欢迎探讨。

接下来一起看看鸿蒙中的相对布局吧。

相对布局RelativeContainer

概述

RelativeContainer为采用相对布局的容器,支持容器内部的子元素设置相对位置关系。子元素支持指定兄弟元素作为锚点,也支持指定父容器作为锚点 ,基于锚点做相对位置布局。下图是一个RelativeContainer的概念图,图中的虚线表示位置的依赖关系。

看起来和Android没什么差别,可以依赖兄弟组件,也可以依赖父布局,同样不可以依赖兄弟的儿子。哈哈

锚点设置

锚点设置是指设置子元素相对于父元素或兄弟元素的位置依赖关系。在水平方向上,可以设置left、middle、right的锚点。在竖直方向上,可以设置top、center、bottom的锚点。为了明确定义锚点,必须为RelativeContainer及其子元素设置ID,用于指定锚点信息。ID默认为"container",其余子元素的ID通过id属性设置。
未设置ID的子元素在RelativeContainer中不会显示。

这一段话中的关键点不少,
1、RelativeContainer有默认ID
2、子元素必须设置ID,不设置ID的话不显示

相对布局的代码写法

RelativeContainer父组件为锚点,__container__代表父容器的id。

javascript 复制代码
RelativeContainer() {
  Row()
    // 添加其他属性
    .alignRules({
      top: { anchor: '__container__', align: VerticalAlign.Top },
      left: { anchor: '__container__', align: HorizontalAlign.Start }
    })
    .id("row1")

  Row()
    ...
    .alignRules({
      top: { anchor: '__container__', align: VerticalAlign.Top },
      right: { anchor: '__container__', align: HorizontalAlign.End }
    })
    .id("row2")
}
...

设置相对于锚点的对齐位置

设置了锚点之后,可以通过align设置相对于锚点的对齐位置。

在水平方向上,对齐位置可以设置为HorizontalAlign.Start、HorizontalAlign.Center、HorizontalAlign.End。

在竖直方向上,对齐位置可以设置为VerticalAlign.Top、VerticalAlign.Center、VerticalAlign.Bottom。

场景实例

javascript 复制代码
@Entry
@Component
struct Index {
  build() {
    Row() {
      RelativeContainer() {
        Row()
          .width(100)
          .height(100)
          .backgroundColor('#FF3333')
          .alignRules({
            top: { anchor: '__container__', align: VerticalAlign.Top },  //以父容器为锚点,竖直方向顶头对齐
            middle: { anchor: '__container__', align: HorizontalAlign.Center }  //以父容器为锚点,水平方向居中对齐
          })
          .id('row1')  //设置锚点为row1

        Row() {
          Image($r('app.media.icon'))
        }
        .height(100).width(100)
        .alignRules({
          top: { anchor: 'row1', align: VerticalAlign.Bottom },  //以row1组件为锚点,竖直方向底端对齐
          left: { anchor: 'row1', align: HorizontalAlign.Start }  //以row1组件为锚点,水平方向开头对齐
        })
        .id('row2')  //设置锚点为row2

        Row()
          .width(100)
          .height(100)
          .backgroundColor('#FFCC00')
          .alignRules({
            top: { anchor: 'row2', align: VerticalAlign.Top }
          })
          .id('row3')  //设置锚点为row3

        Row()
          .width(100)
          .height(100)
          .backgroundColor('#FF9966')
          .alignRules({
            top: { anchor: 'row2', align: VerticalAlign.Top },
            left: { anchor: 'row2', align: HorizontalAlign.End },
          })
          .id('row4')  //设置锚点为row4

        Row()
          .width(100)
          .height(100)
          .backgroundColor('#FF66FF')
          .alignRules({
            top: { anchor: 'row2', align: VerticalAlign.Bottom },
            middle: { anchor: 'row2', align: HorizontalAlign.Center }
          })
          .id('row5')  //设置锚点为row5
      }
      .width(300).height(300)
      .border({ width: 2, color: '#6699FF' })
    }
    .height('100%').margin({ left: 30 })
  }
}

结语

和Android差不多吧,语法熟悉下就可以了。

相关推荐
liang_jy2 小时前
Android SparseArray
android·源码
liang_jy3 小时前
Activity 启动流程扩展篇(一)—— startActivityInner 任务决策全解析
android·源码
jiejiejiejie_3 小时前
Flutter for OpenHarmony 心情日记功能实战指南
flutter·华为
NPE~4 小时前
[App逆向]脱壳实战
android·教程·逆向·android逆向·逆向分析
木易 士心4 小时前
别再只会用 drawCircle 了!一文搞懂 Android Canvas 底层机制
android
Math_teacher_fan4 小时前
Flutter 跨平台开发实战:鸿蒙与音乐律动艺术(六)、Lissajous 利萨茹曲线:频率耦合的轨迹艺术
flutter·ui·数学建模·华为·harmonyos·鸿蒙系统
AtOR CUES5 小时前
MySQL——表操作及查询
android·mysql·adb
xmdy58665 小时前
Flutter+开源鸿蒙实战|智安盾电商溯源平台Day3 溯源查询逻辑+鸿蒙网络请求适配
flutter·开源·harmonyos
maaath6 小时前
【maaath】Flutter 跨平台日历日程应用开发实战
flutter·华为·harmonyos
怣疯knight6 小时前
安卓App无法增加自定义图片作为图标功能
android