鸿蒙——布局——线性布局

前提知识:

组件与布局含义

组件是什么?

组件是鸿蒙 UI 开发中最小的可复用可视化单元,举一个比较简单的例子,你所输入的文本框,就是一个组件

布局是什么?

  • 带排版规则的容器:能装组件,还规定组件怎么摆
  • 布局本身默认看不见,但可加样式(如背景色)让它显现

疑问:我想大多数人都有过这个疑问,为什么会有这么多的布局?原因如下

  • 一是因为有不同的展示区域,电脑,平板,手机,需要适应不同的屏幕大小,来保证排版的不变
  • 二是我们需要复杂的排版画面实现视觉效果,以至于需要不同的布局方式

二、线性布局

定义

将子组件按照单一方向(水平或垂直)依次排列的布局方式

通俗理解:把它想象成排队的人 ------ 要么排成一横排,要么排成一竖列,组件之间不会重叠,而是沿着指定方向紧密或分散地排列

核心特点

  • 单一方向排列:分为两种核心组件 ------Row(水平方向,从左到右)和Column(垂直方向,从上到下),子组件 按照指定方向线性排布,默认无重叠,当然这些是套娃的,每一层都是这样的排列方式

  • 对齐与间距可控 :统控所有子组件 在 "主轴"(排列方向)和 "交叉轴"(垂直于排列方向)上的对齐方式 ,也能设置组件间的间距

  • 自适应 与占比分配:支持通过flexGrow/flexShrink/flexBasis控制子组件的伸缩规则 ,或通过LayoutWeight设置占比,适配 不同屏幕尺寸

适用场景

几乎所有基础 UI 结构都依赖线性布局搭建,典型应用场景包括

  • 基础页面结构:例如页面顶部的导航栏 (Row:左侧返回按钮 + 中间标题 + 右侧更多按钮)、页面底部的功能栏(Row:首页 / 分类 / 我的等图标)
  • 表单布局:例如登录页的 "标签 + 输入框" 组合(Column:账号行 + 密码行 + 登录按钮)
  • 列表项布局:例如联系人列表项(Row:头像 + 姓名 + 电话)、商品列表项(Row:商品图片 + 商品名称 / 价格)
  • 均分布局:例如底部 4 个功能按钮均分屏幕宽度(Row+LayoutWeight)、垂直方向 :标题 / 内容 / 按钮按比例分配高度(Column+LayoutWeight)
  • 嵌套组合:与其他布局(如 Stack、Grid)嵌套,搭建复杂 UI(例如 Row 嵌套 Column 实现 "左图右文 + 多行文字" 的卡片)

实现

在鸿蒙中使用 Column组件/Row 组件实现层叠布局

了解一些核心属性

  1. 设置在布局上的属性:
    1. justifyContent
      • 含义:控制子组件在主轴上的对齐方式
      • 写法: .justifyContent(FlexAlign.Center)
    2. alignItems
      • 含义:控制子组件在交叉轴上的对齐方式
      • 写法: .alignItems(ItemAlign.Center)
    3. space
      • 含义:设置子组件之间的间距(单位 vp)

注:justifyContent与 alignItems需要将布局设置上宽高,易观察

常用的一些 FlexAlign值
FlexAlign.Start 主轴起始端对齐(Row:左对齐;Column:上对齐)
FlexAlign.End 主轴末端对齐(Row:右对齐;Column:下对齐)
FlexAlign.Center 主轴居中对齐(Row:水平居中;Column:垂直居中)
FlexAlign.SpaceBetween 两端对齐,子组件之间间隔相等(无左右 / 上下边距)
FlexAlign.SpaceAround 每个子组件两侧间隔相等(左右 / 上下有一半间距)
FlexAlign.SpaceEvenly 子组件之间、子组件与边界的间隔全部相等
常用的一些 ItemAlign值
ItemAlign.Start 交叉轴起点对齐(Row:垂直上对齐;Column:水平左对齐)
ItemAlign.Center 交叉轴 居中对齐(Row:垂直居中;Column:水平居中)
ItemAlign.End 交叉轴终点对齐(Row:垂直下对齐;Column:水平右对齐)
ItemAlign.Stretch 子组件拉伸填满交叉轴(需子组件交叉轴方向无固定尺寸)

注: Stretch 的生效条件为子组件在交叉轴方向不能设置固定尺寸

  • 例如:比如 Row 中,子组件不设 height,Stretch 才会让子组件垂直拉伸填满 Row 的高度
  1. 设置在子组件属性
    1. LayoutWeight
      • 定义:设置主轴方向的占比 ,需父组件尺寸固定
      • 写法:.layoutWeight(1)
    2. flexGrow
      • 定义:主轴空间充足时的拉伸比例。优先级低于 LayoutWeight
      • 写法:.flexGrow(1)
    3. flexShrink
      • 定义:主轴空间不足时的收缩比例
      • 写法: .flexShrink(1)

代码实现

bash 复制代码
@Entry
@Component
struct Page1 {
  build() {
    Column({}){
      Column( {space: 10}) {
        Text('解,破除疑惑,但是需要一直在路上1')
          // .layoutWeight(1)
          .backgroundColor('#923d12')
        Button("你倒是解一下啊")
          // .layoutWeight(1)
          .backgroundColor('#d23d22')
        Text('解,破除疑惑,但是需要一直在路上2')
          // .layoutWeight(2)
          .backgroundColor('#d23d22')
          .flexShrink(1)
        Text('解,破除疑惑,但是需要一直在路上3')
          // .flexGrow(1)
      }
      .width('100%').height("100%")
      .backgroundColor(Color.Pink)
      .justifyContent(FlexAlign.Start)
      .alignItems(HorizontalAlign.End)
    }
  }
}

更新于25_12_20------22:50

相关推荐
风华圆舞14 分钟前
MethodChannel 在 Flutter 与 ArkTS 之间是怎么工作的
flutter·华为·harmonyos
G_dou_20 分钟前
Flutter三方库适配OpenHarmony【prime_checker】质数检测器项目完整实战
flutter·harmonyos
G_dou_20 分钟前
Flutter三方库适配OpenHarmony【random_joke】随机笑话应用项目完整实战
flutter·harmonyos
风华圆舞36 分钟前
鸿蒙 Flutter 平台通道设计:为什么一项能力一个 channel
flutter·华为·harmonyos
G_dou_44 分钟前
Flutter三方库适配OpenHarmony【quote_of_day】每日名言应用项目完整实战
flutter·harmonyos
高工智能汽车1 小时前
华为乾崑智驾,「年度目标」隐忧?
华为
梦想不只是梦与想1 小时前
鸿蒙 消息推送服务:使用入门(一)
harmonyos·鸿蒙·推送
大雷神1 小时前
【共创季稿事节】HarmonyOS 6.1 创新特性适配实战:双镜记忆相机从 6.0 到 6.1 的升级记录
harmonyos
互联网散修1 小时前
鸿蒙实战:快递地址图片识别与自动填充
华为·harmonyos·快递地址智能识别