ArkUI 常用布局容器之相对布局(RelativeContainer)

一、 相对布局概述

RelativeContainer 为相对布局的容器组件,支持容器内部的子元素设置相对位置关系。子元素支持指定兄弟元素作为锚点,也支持指定父容器作为锚点,基于锚点做相对位置布局。

🔊 锚点:通过锚点设置当前元素基于哪个元素确定位置。
❗️注意
  • 必须为RelativeContainer及其子元素设置ID
  • RelativeContainer的ID默认为__container__
  • 子元素的ID通过id属性设置
  • 未设置ID的子元素在RelativeContainer中不显示

二、相对布局的使用

子元素通过alignRules属性设置锚点。在水平方向上,可以设置left、middle、right的锚点;在竖直方向上,可以设置top、center、bottom的锚点。

🐹 1. 水平方向:left、middle、right的锚点对齐方式

  • HorizontalAlign.Start:水平方向首端对齐
  • HorizontalAlign.Center:水平方向中点对齐
  • HorizontalAlign.End:水平方向尾部对齐

🐹 2. 竖直方向:top、center、bottom的锚点对齐方式

  • VerticalAlign.Top:垂直方向顶部对齐
  • VerticalAlign.Center:垂直方式中点对齐
  • VerticalAlign.Bottom:垂直方向底部对齐

三、 子组件位置偏移量

🐹 1. offset

子组件经过锚点相对位置对齐后,位置可能还不是目标位置,此时可以通过offset属性设置位置偏移量进行微调。

❗️注意:偏移量的参考点是自身

🐹 2. bias

bias属性可以在子组件相对于锚点定位后,提供额外的偏移量,以微调其在容器中的位置。

🔊:在API版本11及以上,RelativeContainer支持Bias属性。虽然之前版本中使用offset属性,但建议使用Bias属性以获得更好的布局控制‌。

举个例子:在组件宽高有具体值(如80vp,20%,100px等)时,并且水平或垂直方向各自有两个锚点时,对应的水平或垂直Bias才会生效:

@Entry
@Component
struct Index {
  /** 构建函数 */
  build() {
    RelativeContainer() {
      RelativeContainer() {
        /** 红色块 */
        Text().backgroundColor(Color.Red).width(80).aspectRatio(1).id('text_1')
        /** 绿色块 */
        Text()
          .backgroundColor(Color.Green)
          .width(80)
          .aspectRatio(1)
          .id('text_2')
          .alignRules({
            right: {
              anchor: '__container__',
              align: HorizontalAlign.End
            }
          })
        /** 橘色块 */
        Text()
          .backgroundColor(Color.Orange)
          .width(80)
          .aspectRatio(1)
          .id('text_3')
          .alignRules({
            center: {
              anchor: '__container__',
              align: VerticalAlign.Center
            }
          })
        /** 蓝色块 */
        Text()
          .id('test_1')
          .fontSize(30)
          .height(80)
          .width(80)
          .backgroundColor(Color.Blue)
          .fontWeight(FontWeight.Bold)
          .alignRules({
            left: {
              anchor: 'text_1',
              align: HorizontalAlign.End
            },
            right: {
              anchor: 'text_2',
              align: HorizontalAlign.Start
            },
            top: {
              anchor: 'text_1',
              align: VerticalAlign.Top
            },
            bottom: {
              anchor: 'text_3',
              align: VerticalAlign.Bottom
            },
            bias: {
              horizontal: 0.5,
              vertical: 0.4
            }
          })
      }
      .width('100%')
      .height('100%')
      .margin({ top: 40 })
    }.width('100%').height('100%')
  }
}

 

posted on 2024-04-03 23:12  梁飞宇  阅读(692)  评论(0)    收藏  举报