当前位置: 首页 > news >正文

鸿蒙学习实战之路-RelativeLayout相对布局全攻略

鸿蒙学习实战之路-线性布局 Row_Column 全攻略

最近好多朋友问我:"鸿蒙开发的布局咋这么难?写个页面调来调去总是不对齐,是不是我没天赋?" o(╯□╰)o

今天这篇,我就手把手带你搞定鸿蒙最基础也是最常用的线性布局(Row/Column),相当于给你配齐鸿蒙布局的"锅碗瓢盆",以后写页面就像炒菜一样顺手!


一、啥是线性布局?

线性布局是鸿蒙开发中最常用的布局方式,就像咱们排队买奶茶,要么竖排(Column)要么横排(Row),简单直接!

  • Column:子元素垂直排列,主轴是上下方向
  • Row:子元素水平排列,主轴是左右方向

(Column 垂直排列示意图)

(Row 水平排列示意图)


二、基础概念先搞懂

在开始写代码之前,咱们先把几个关键概念搞清楚,不然写起来像无头苍蝇:

  • 布局容器:就是 Row/Column 这些能装其他元素的"容器",负责计算子元素尺寸和排列
  • 布局子元素:容器里面的各种元素,比如 Text、Image、Button 这些
  • 主轴:布局的主要方向,Row 的主轴是水平,Column 的主轴是垂直
  • 交叉轴:和主轴垂直的方向,Row 的交叉轴是垂直,Column 的交叉轴是水平

🥦 西兰花小贴士
这些概念其实和 CSS 的 Flex 布局很像,前端同学可以直接类比理解,学起来更快!


三、实战演练:从简单到复杂

1. 第一步:设置子元素间距

写布局第一件事,就是给子元素留点呼吸空间!鸿蒙提供了space属性,一行代码搞定等间距排列:

Column 垂直间距示例

Column({ space: 20 }) {  // 设置子元素垂直间距为20Text('space: 20').fontSize(15).fontColor(Color.Gray).width('90%')Row().width('90%').height(50).backgroundColor(0xF5DEB3)  // 西兰花色的方块^_^Row().width('90%').height(50).backgroundColor(0xD2B48C)  // 花菜色的方块^_^Row().width('90%').height(50).backgroundColor(0xF5DEB3)
}.width('100%')

Row 水平间距示例

Row({ space: 35 }) {  // 设置子元素水平间距为35Text('space: 35').fontSize(15).fontColor(Color.Gray)Row().width('10%').height(150).backgroundColor(0xF5DEB3)Row().width('10%').height(150).backgroundColor(0xD2B48C)Row().width('10%').height(150).backgroundColor(0xF5DEB3)
}.width('90%')

2. 第二步:主轴对齐方式

子元素在主轴上怎么排列?是靠左还是靠右?还是均匀分布?这就需要justifyContent属性了:

Column 垂直排列示例

// 居中对齐
Column({}) {Column() {}.width('80%').height(50).backgroundColor(0xF5DEB3)Column() {}.width('80%').height(50).backgroundColor(0xD2B48C)Column() {}.width('80%').height(50).backgroundColor(0xF5DEB3)
}.width('100%').height(300).backgroundColor('rgb(242,242,242)')
.justifyContent(FlexAlign.Center)  // 垂直居中

常见的主轴对齐值

效果
FlexAlign.Start 主轴起始对齐(默认)
FlexAlign.Center 主轴居中对齐
FlexAlign.End 主轴结束对齐
FlexAlign.SpaceBetween 两端对齐,中间均匀分布
FlexAlign.SpaceAround 每个元素两侧间距相等
FlexAlign.SpaceEvenly 所有间距(包括首尾)都相等

3. 第三步:交叉轴对齐方式

主轴搞完了,交叉轴怎么对齐?比如 Row 里面的元素是顶部对齐还是垂直居中?这就需要alignItems属性:

Row 垂直对齐示例

// 垂直居中对齐
Row({}) {Column() {}.width('20%').height(30).backgroundColor(0xF5DEB3)Column() {}.width('20%').height(30).backgroundColor(0xD2B48C)Column() {}.width('20%').height(30).backgroundColor(0xF5DEB3)
}.width('100%').height(200).backgroundColor('rgb(242,242,242)')
.alignItems(VerticalAlign.Center)  // 垂直居中

常见的交叉轴对齐值

  • Column 容器(交叉轴是水平):HorizontalAlign.Start/Center/End
  • Row 容器(交叉轴是垂直):VerticalAlign.Top/Center/Bottom

🥦 西兰花警告
别搞混主轴和交叉轴!很多新手一开始写不对布局,就是因为把这两个轴的对齐属性搞反了,一定要记住:justifyContent管主轴,alignItems管交叉轴!

4. 第四步:单个元素自定义对齐

如果想让某个子元素和其他元素对齐方式不一样怎么办?比如其他元素都左对齐,就它右对齐?

鸿蒙提供了alignSelf属性,专门用来覆盖单个元素的交叉轴对齐方式:

Column({}) {Column() {}.width('80%').height(50).backgroundColor(0xF5DEB3)Column() {}.width('80%').height(50).backgroundColor(0xD2B48C).alignSelf(HorizontalAlign.End)  // 单独设置这个元素右对齐Column() {}.width('80%').height(50).backgroundColor(0xF5DEB3)
}.width('100%').alignItems(HorizontalAlign.Start).backgroundColor('rgb(242,242,242)')

5. 第五步:自适应布局

在不同尺寸的设备上,布局要能自适应调整,鸿蒙提供了几种常用的自适应方式:

自适应拉伸

使用flexGrow属性,让子元素自动拉伸填充剩余空间:

Row({}) {Column() {}.width('20%').height(30).backgroundColor(0xF5DEB3)Column() {}.width('20%').height(30).backgroundColor(0xD2B48C).flexGrow(1)  // 这个元素自动拉伸填充剩余空间Column() {}.width('20%').height(30).backgroundColor(0xF5DEB3)
}.width('100%').height(100).backgroundColor('rgb(242,242,242)')

自适应延伸

当内容太多一屏放不下时,我们可以用滚动条来展示:

Column() {Text('自适应延伸示例').fontSize(20).margin({ bottom: 20 })Column({ space: 10 }) {// 假设有很多内容ForEach(new Array(20), (_, index) => {Row().width('100%').height(50).backgroundColor(index % 2 === 0 ? 0xF5DEB3 : 0xD2B48C)})}.width('100%').height(200).scrollable(true)  // 开启滚动
}
.width('100%')
.padding(20)

四、常见布局场景实战

1. 登录页面布局

Column() {Text('用户登录').fontSize(30).margin({ bottom: 50 })Column({ space: 20 }) {TextInput({ placeholder: '请输入用户名' }).width('80%').height(50).backgroundColor(Color.White).borderRadius(8)TextInput({ placeholder: '请输入密码' }).width('80%').height(50).backgroundColor(Color.White).borderRadius(8).type(InputType.Password)Button('登录').width('80%').height(50).backgroundColor(0x3366FF).fontColor(Color.White).borderRadius(8)}
}
.width('100%')
.height('100%')
.backgroundColor('rgb(242,242,242)')
.justifyContent(FlexAlign.Center)

2. 底部导航栏布局

Row() {Column({ space: 5 }) {Image($r('app.media.home')).width(24).height(24)Text('首页').fontSize(12)}.flexGrow(1).alignItems(HorizontalAlign.Center)Column({ space: 5 }) {Image($r('app.media.category')).width(24).height(24)Text('分类').fontSize(12)}.flexGrow(1).alignItems(HorizontalAlign.Center)Column({ space: 5 }) {Image($r('app.media.cart')).width(24).height(24)Text('购物车').fontSize(12)}.flexGrow(1).alignItems(HorizontalAlign.Center)Column({ space: 5 }) {Image($r('app.media.mine')).width(24).height(24)Text('我的').fontSize(12)}.flexGrow(1).alignItems(HorizontalAlign.Center)
}
.width('100%')
.height(60)
.backgroundColor(Color.White)
.borderTop({ width: 1, color: 0xF0F0F0 })

五、性能优化小技巧

  1. 避免嵌套过深:布局嵌套不要超过 3 层,不然渲染性能会下降
  2. 合理设置宽高:尽量使用百分比或固定值,避免不必要的计算
  3. 使用 flexGrow 代替固定宽度:在需要自适应的场景下,flexGrow 比计算百分比更高效
  4. 减少重排重绘:避免频繁修改布局属性,尽量使用状态管理来控制

🥦 西兰花小贴士
DevEco Studio 有个布局边界工具,可以帮助你查看布局的渲染边界,优化性能!


六、总结与下一步

今天咱们学会了:

  • 线性布局的基本概念(Row/Column、主轴/交叉轴)
  • 子元素间距设置(space 属性)
  • 主轴对齐(justifyContent)
  • 交叉轴对齐(alignItems/alignSelf)
  • 自适应布局技巧
  • 实际布局场景应用

现在你已经掌握了鸿蒙布局的基础技能,就像学会了切菜、炒菜的基本动作,接下来可以开始做更复杂的"菜品"了!

👉 预告:《鸿蒙学习实战之路-弹性布局 Flex 全攻略》

📚 推荐资料:

  • 官方文档:线性布局开发指南
  • 视频教程:开发者学堂-布局开发

我是盐焗西兰花,
不教理论,只给你能跑的代码和避坑指南。
下期见!🥦

http://www.zskr.cn/news/143706.html

相关文章:

  • Harmony之路:实战起航(二)——数据模型与业务逻辑封装
  • 国内仿真云平台哪家强?该如何选择?
  • 10 个AI写作工具,助继续教育学生轻松写论文!
  • 新生态・新动能:人工智能产业格局分析
  • Harmony学习之安全与隐私保护
  • 精密仪器中的微型导轨如何选对润滑脂?
  • Harmony学习之多设备适配
  • 旧文章自动更新发布时间伪装成新内容|会被谷歌惩罚吗?
  • 构建系统(Colcon)依赖管理(Rosdep)
  • 如何选择德诺超声波焊接机才合适?
  • 国内有没有好的国产PaaS平台?
  • 大模型微调7种方法:零基础入门全指南
  • Harmony学习之声明式UI开发
  • 【C++】2.3 二叉搜索树的实现(附代码)
  • EagleTrader交易员采访|不遵守交易规则,真的是自由吗?
  • Harmony学习之开发环境搭建与第一个应用
  • GraniStudio:单轴PTP运动例程
  • GraniStudio:IO写入例程
  • 安川焊接机器人混合气节约方案
  • BAS模拟入侵攻击系统:前置防控核心,守护企业网络安全
  • 青少年学习困境干预的系统化路径:APCF整合咨询体系的十年技术演进与实践
  • 任务6
  • 当下,官网为什么越来越重要了
  • 自学嵌入式day37,网络编程
  • Harmony之路:实战起航(一)——项目结构与模块化设计
  • Harmony之路:数据持久化——Preferences本地存储方案
  • 震惊!想找靠谱艺术漆品牌?联系方法竟藏在这!
  • Harmony之路:网络请求——HTTP模块与数据交互
  • 基于大数据的二手交易推荐系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 华为云服务器,使用Centos7.9安装docker