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

一、定义

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

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

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

二、核心特点

  • 相对定位核心:子组件的位置不是固定的,而是相对于父容器的边界或其他子组件的特定锚点来确定
  • 灵活不重叠: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------垂直锚点
相关推荐
木斯佳4 分钟前
HarmonyOS 6实战(源码教学篇)— MindSpore Lite Kit 【从证件照工具到端侧图像分割技术全解析】
华为·harmonyos
三声三视15 分钟前
HarmonyOS 路由框架 HMRouter 全解析:从原理到实践
华为·harmonyos
王码码20351 小时前
Flutter for OpenHarmony 实战之基础组件:第十七篇 滚动进阶 ScrollController 与 Scrollbar
flutter·harmonyos
以太浮标1 小时前
华为eNSP模拟器综合实验之- DHCP Option 43 解析
服务器·网络·华为·云计算
小哥Mark1 小时前
Flutter开发鸿蒙年味 + 实用实战应用|春节祝福:列表选卡 + 贴纸拖动 + 截图分享
flutter·harmonyos·鸿蒙
m0_685535081 小时前
华为光学工程师面试题汇总
华为·光学·光学设计·光学工程·镜头设计
王码码20351 小时前
Flutter for OpenHarmony 实战之基础组件:第十六篇 约束布局 ConstrainedBox 与 AspectRatio
flutter·harmonyos
2501_921930832 小时前
基础入门 React Native 鸿蒙跨平台开发:Video 全屏播放与画中画 鸿蒙实战
react native·react.js·harmonyos
果粒蹬i2 小时前
【HarmonyOS】鸿蒙React Native 实战:打造流畅的底部导航
react native·华为·harmonyos
2501_921930832 小时前
基础入门 React Native 鸿蒙跨平台开发:react-native-switch 开关适配
react native·react.js·harmonyos