鸿蒙——布局——相对布局

一、定义

通过组件之间的相对位置关系来确定每个组件的摆放位置

通俗一点的理解就是:布局就是一间教室,座位是我们的描述点

  • 我在教室的右下角
  • 你在我的右边,她在我的前面

二、核心特点

  • 相对定位核心:子组件的位置不是固定的,而是相对于父容器的边界或其他子组件的特定锚点来确定
  • 灵活不重叠:RelativeContainer 的子组件默认 根据相对规则分散摆放,不会主动重叠

三、使用场景

相对布局作为灵活性最高的布局之一,几乎能实现非堆叠类的复杂排版,典型场景包括

  • 表单类 UI:例如 "用户名输入框 左侧对齐标签文字,密码输入框 在用户名输入框 正下方,登录按钮密码框下方且水平居中"
  • 卡片式布局:商品卡片中 "商品图片 居左,标题 在图片右侧上方,价格 在标题下方,销量标签价格右侧",想一想淘宝购买商品布局
  • 个性化排版:例如 "返回按钮靠左上角,标题文字居中,更多按钮靠右上角" 的标题栏布局
  • 多组件联动布局:例如 "广告横幅靠顶部,列表在横幅下方占满剩余空间,底部按钮在列表下方且靠右下角"
  • 适配性布局:不同屏幕尺寸下,通过相对关系保证组件的位置比例不变(比如 "确认按钮始终在弹窗的右下角,距离右边界 20vp、下边界 15vp")

四、如何实现

实现

  • 用RelativeContainer组件实现相对布局通过

具体实现:

了解核心属性与概念

  1. 必备属性

    1. alignSelf
      • 作用:相对于父容器的对齐方式
      • 写法:.alignSelf(ItemAlign.Center)
    2. id
      • 作用: 给子组件取一个名字,这是唯一标识
      • 写法:.id('usernameLabel')
  2. 组件之间设置的属性

    1. alignRules:子组件的相对定位规则,是一个对象,内部包含
    • anchor:目标组件 ID(父容器固定为 container,子组件为自定义 id)
    • align:对齐目标组件的位置
      • 水平用 HorizontalAlign有/Start//End/Center可选
      • 垂直用 VerticalAlign有Top/Bottom/Center选择

注:组件间相对规则 > 相对父容器规则 > alignSelf 兜底规则

代码实现:

bash 复制代码
  // 子组件1:蓝色矩形(相对父容器)
        Text('蓝色矩形').width(150) .height(80).backgroundColor(Color.Blue) .fontColor(Color.White)
          .id('blueRect')
          .alignRules({
            middle: { anchor: '__container__', align: HorizontalAlign.Center}, // 水平居中
            bottom: { anchor: '__container__', align: VerticalAlign.Top } // 顶部对齐
          })
          .margin({ top: 20 }) // 顶部偏移20vp

理解:将这个子组件取名为blueRect,自身的水平居中位置与父容器的水平居中锚点对齐,自身的垂直底部与父容器的垂直底部锚点对齐,但是margin,要离这个对齐点20vp的距离

bash 复制代码
  // 子组件2:红色矩形(相对蓝色矩形)
        Text('红色矩形') .width(120) .height(60) .backgroundColor(Color.Red).fontColor(Color.White)
          .id('redRect')
          .alignRules({
            start: { anchor: 'blueRect', align: HorizontalAlign.Center }, // 水平居中蓝色矩形
            top: { anchor: 'blueRect', align: VerticalAlign.Top } // 顶部对齐蓝色矩形底部
          })
          .margin({ top: 10 }) // 顶部偏移10vp

理解:将这个子组件取名为redRect,自身的水平开始位置与blueRect的水平居中锚点对齐,自身的垂直顶部与父容器的垂直顶部锚点对齐,但是margin,要离这个对齐点10vp的距离

bash 复制代码
 // 子组件3:绿色正方形(相对红色矩形)
        Text('绿色正方形').width(80) .height(80).backgroundColor(Color.Green).fontColor(Color.White)
          .id('greenSquare')
          .alignRules({
            bottom: { anchor: 'redRect', align: VerticalAlign.Center }, // 垂直居中红色矩形
            right: { anchor: 'redRect', align: HorizontalAlign.End } // 左侧对齐红色矩形右侧
          })
          .margin({ left: 10 }) // 左侧偏移10vp

理解:将这个子组件取名为greenSquare,自身的水平右边位置与redRect的水平右侧锚点对齐,自身的垂直底部与父容器的垂直居中锚点对齐,但是margin,要离这个对齐点10vp的距离

所有代码实现:

bash 复制代码
@Entry
@Component
struct Page1 {
  build() {
    Column() {
      // 相对布局容器
      RelativeContainer() {
        // 子组件1:蓝色矩形(相对父容器)
        Text('蓝色矩形').width(150) .height(80).backgroundColor(Color.Blue) .fontColor(Color.White)
          .id('blueRect')
          .alignRules({
            middle: { anchor: '__container__', align: HorizontalAlign.Center}, // 水平居中
            bottom: { anchor: '__container__', align: VerticalAlign.Top } // 顶部对齐
          })
          .margin({ top: 20 }) // 顶部偏移20vp

        // 子组件2:红色矩形(相对蓝色矩形)
        Text('红色矩形') .width(120) .height(60) .backgroundColor(Color.Red).fontColor(Color.White)
          .id('redRect')
          .alignRules({
            start: { anchor: 'blueRect', align: HorizontalAlign.Center }, // 水平居中蓝色矩形
            top: { anchor: 'blueRect', align: VerticalAlign.Top } // 顶部对齐蓝色矩形底部
          })
          .margin({ top: 10 }) // 顶部偏移10vp

        // 子组件3:绿色正方形(相对红色矩形)
        Text('绿色正方形').width(80) .height(80).backgroundColor(Color.Green).fontColor(Color.White)
          .id('greenSquare')
          .alignRules({
            bottom: { anchor: 'redRect', align: VerticalAlign.Center }, // 垂直居中红色矩形
            right: { anchor: 'redRect', align: HorizontalAlign.End } // 左侧对齐红色矩形右侧
          })
          .margin({ left: 10 }) // 左侧偏移10vp
      }
      .width('90%')
      .height(300)
      .backgroundColor(Color.Grey)
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

实现效果:

注:

  • 自身组件的锚点与目标锚点
    • start/middle/left/right------水平锚点
    • top/center/bottom------垂直锚点
相关推荐
SummerKaze19 小时前
为鸿蒙开发者写一个 nvm:hmvm 的设计与实现
harmonyos
在人间耕耘2 天前
HarmonyOS Vision Kit 视觉AI实战:把官方 Demo 改造成一套能长期复用的组件库
人工智能·深度学习·harmonyos
王码码20353 天前
Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南
android·flutter·ui·华为·node.js·harmonyos
HarmonyOS_SDK3 天前
【FAQ】HarmonyOS SDK 闭源开放能力 — Ads Kit
harmonyos
Swift社区3 天前
如何利用 ArkUI 框架优化鸿蒙应用的渲染性能
华为·harmonyos
特立独行的猫a3 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS影视票房榜组件完整实现过程
华为·uni-app·harmonyos·轮播图·uniapp-x
盐焗西兰花3 天前
鸿蒙学习实战之路-STG系列(5/11)-守护策略管理-添加与修改策略
服务器·学习·harmonyos
盐焗西兰花3 天前
鸿蒙学习实战之路-STG系列(4/11)-应用选择页功能详解
服务器·学习·harmonyos
lbb 小魔仙3 天前
鸿蒙跨平台项目实战篇03:React Native Bundle增量更新详解
react native·react.js·harmonyos
特立独行的猫a3 天前
uni-app x跨平台开发实战:开发鸿蒙HarmonyOS滚动卡片组件,scroll-view无法滚动踩坑全记录
华为·uni-app·harmonyos·uniapp-x