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

前提知识:

组件与布局含义

组件是什么?

组件是鸿蒙 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

相关推荐
陈_杨23 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片开发完全指南
前端·harmonyos
陈_杨30 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片刷新机制
前端·harmonyos
哈__1 小时前
从入门小白到精通,玩转 React Native 鸿蒙跨平台开发:TouchableOpacity 触摸反馈组件
react native·react.js·harmonyos
小雨下雨的雨1 小时前
Flutter 框架跨平台鸿蒙开发 —— Flex 控件之响应式弹性布局
flutter·ui·华为·harmonyos·鸿蒙系统
哈__1 小时前
入门小白到精通,玩转 React Native 鸿蒙跨平台开发:Button 按钮组件与点击事件
react native·react.js·harmonyos
奋斗的小青年!!1 小时前
OpenHarmony Flutter实战:打造高性能订单确认流程步骤条
flutter·harmonyos·鸿蒙
Georgewu2 小时前
【HarmonyOS应用开发】鸿蒙碰一碰分享开发源码和流程讲解
harmonyos
行者962 小时前
Flutter跨平台骨架屏组件在鸿蒙系统上的实践与优化
flutter·harmonyos·鸿蒙
奋斗的小青年!!2 小时前
Flutter自定义图表跨平台适配OpenHarmony
flutter·harmonyos·鸿蒙
奋斗的小青年!!2 小时前
Flutter + OpenHarmony:高性能搜索组件深度优化实战解析
flutter·harmonyos·鸿蒙