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

鸿蒙开发3--UI布局(玩转鸿蒙的Row、Column与Stack容器)

在前两文中,我们已经掌握了怎么使用基础组件并通过@State来驱动UI更新。

但是,要从简单的按钮和文本进化到精美的用户界面,我们必须学会怎么组织和排列这些组件。

今天,我们聊一聊ArkUI中最核心的布局容器:Row、Column、Stack,以及强大的Flex弹性布局。

一、布局的本质

在ArkUI中,布局就是把一组UI组件(子组件)按照特定的规则放在一个容器(父组件)里。

选择哪种容器,就决定了他内部组件的排列方式。

可以想象成整理书架,你可以选择横着放、竖着放,或者把几本书叠在一起。

1.1. Column (垂直布局)

Column是我们最熟悉的布局容器之一,他会把所有的子组件从上到下垂直排列。

基础用法:

 Column() {Text('用户登录').fontSize(24).fontWeight(FontWeight.Bold)TextInput({ placeholder: '请输入用户名' }).margin(10)TextInput({ placeholder: '请输入密码' }).margin(10)Button('登录').width(200).margin(10)}.width('100%').padding(20)

这个简单的登录表单就是Column的典型应用场景。

image-20251002171206955

常用属性 (对齐方式): Column内部的对齐是控制水平方向(交叉轴)的位置。

  • alignItems(HorizontalAlign):

    • HorizontalAlign.Start: 水平居左(默认)。

    • HorizontalAlign.Center: 水平居中。

    • HorizontalAlign.End: 水平居右。

 Column() {// ...子组件}.width('100%').alignItems(HorizontalAlign.Center) // 让所有子组件水平居中

1.2. Row (水平布局)

跟Column相反,Row会把所有子组件从左到右水平排列。

基础用法:

Row() {Image($r('app.media.avatar')).width(60).height(60).borderRadius(30)​Column() {Text('用户名').fontSize(18)Text('个性签名').fontSize(14).fontColor(Color.Gray)}.alignItems(HorizontalAlign.Start).margin({ left: 10 })}.padding(15).backgroundColor(Color.White).borderRadius(10)

这种左边头像、右边用户信息的结构,就比较适合用Row。

image-20251002171501018

常用属性 (对齐方式): Row内部的对齐是控制垂直方向(交叉轴)的位置。

  • alignItems(VerticalAlign):

    • VerticalAlign.Top: 垂直居上。

    • VerticalAlign.Center: 垂直居中(默认)。

    • VerticalAlign.Bottom: 垂直居下。

1.3. Stack (层叠布局)

Stack的布局允许子组件像Photoshop的图层一样,一个接一个的在Z轴上堆叠起来。

后添加的组件会覆盖在先添加的组件之上。

基础用法:

 Stack() {// 第一层:背景图Image($r('app.media.card_background')).width('100%').height(200)​// 第二层:叠加在图片上的文字Text('新用户专属优惠券').fontColor(Color.White).fontSize(22)}.width(350).borderRadius(15)

在背景图上叠加文字、在视频上放置播放按钮等场景,最适合的就是Stack。

image-20251002172549217

常用属性 (对齐方式): Stack的对齐同时控制水平和垂直方向。

  • alignContent(Alignment): 使用Alignment枚举值,可以精确定位子组件在9个方向的位置(如TopStart, Center, BottomEnd等)。默认是Alignment.Center。

1.4. Flex (弹性布局)

Flex是目前最强大、最灵活的布局方式,Row和Column实际上是Flex的特例。

他不仅能控制主轴方向(水平或垂直),还能管理空间分配、自动换行等复杂场景。

  • Flex({ direction: FlexDirection.Row }) 等价于Row。

  • Flex({ direction: FlexDirection.Column }) 等价于Column。

Flex的核心属性:

  • direction: 主轴方向 (Row, Column, RowReverse, ColumnReverse)。

  • justifyContent: 主轴上的对齐方式 (Start, Center, End, SpaceBetween, SpaceAround, SpaceEvenly)。

  • alignItems: 交叉轴上的对齐方式 (Start, Center, End, Stretch)。

  • wrap: 是否自动换行 (FlexWrap.Wrap, FlexWrap.NoWrap)。

当Row和Column的简单对齐无法满足需求时,比如需要实现两端对齐(SpaceBetween),就必须使用Flex。

二、搭建一个简单的个人名片

根据上面的布局暂时是,构建一个如下图所示的个人名片。

image-20251002165754097

3.1准备

示例图中一共需要四张图片:

头像图标:avatar_icon.png

电话图标:phone_icon.png

邮箱图标:email_icon.png

地址图标:location_icon.png

这些png图片可以去https://www.iconfinder.com/下载。

2.2分析布局

最外层:整个名片是一个从上到下的结构,用Column。

顶部区域:头像、姓名、职位是水平排列的,用Row。

在Row内部,姓名和职位又是垂直排列的,所以需要一个嵌套的Column。

中间区域:分割线,一个简单的Divider组件。

底部区域:三个带图标的联系方式,是水平均匀分布的,用Flex布局最合适。

2.3创建模块

我们还是跟之前的计数器模块一样创建一个独立的模块。

image-20251002170320878

上一步准备的图片资源放在新建模块resources/base/media目录下。

image-20251002170700156

2.4代码实现

 @Entry@Componentstruct Index {build() {// 1. 最外层:垂直布局Column() {// 2. 顶部区域:水平布局Row() {Image($r('app.media.avatar')).width(80).height(80).borderRadius(40)​// 姓名和职位的垂直容器Column() {Text('懒惰蜗牛').fontSize(22).fontWeight(FontWeight.Bold)Text('鸿蒙应用开发工程师').fontSize(16).fontColor(Color.Gray).margin({ top: 5 })}.alignItems(HorizontalAlign.Start) // 文字左对齐.margin({ left: 15 })}.width('100%').padding(20)​// 3. 分割线Divider().strokeWidth(1).color('#f1f1f1').margin({ top: 10 })​// 4. 底部联系方式:弹性布局实现均匀分布Flex({ justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {// 电话Column() {Image($r('app.media.phone_icon')).width(24).height(24)Text('电话').fontSize(14).margin({ top: 5 })}// 邮箱Column() {Image($r('app.media.email_icon')).width(24).height(24)Text('邮箱').fontSize(14).margin({ top: 5 })}// 地址Column() {Image($r('app.media.location_icon')).width(24).height(24)Text('地址').fontSize(14).margin({ top: 5 })}}.width('100%').height(100)​}.width(350).backgroundColor(Color.White).borderRadius(15).shadow({ radius: 10, color: '#dddddd' }).padding(10)}}

总结

今天,我们学习了ArkUI布局的四大金刚:

  • Column:垂直线性布局。

  • Row:水平线性布局。

  • Stack:层叠覆盖布局。

  • Flex:功能最全的弹性布局。

通过组合这些容器,我们可以构建出任何复杂的静态页面。尝试修改布局属性,观察UI的变化,可以加深对布局系统的理解。

http://www.dtcms.com/a/437965.html

相关文章:

  • 为什么要给企业建设网站做单位网站
  • ML4T - 第7章第8节 利用LR预测股票价格走势Predicting stock price moves with Logistic Regression
  • 性能之巅:大小水管问题深究
  • css选择器(继承补充)
  • 郑州高新区做网站的公司聚美优品的电子商务网站建设论文
  • uniapp集成语音识别与图片识别集成方案【百度智能云】
  • SpringCloud API Gateway2.0如何解决docker中应用间IP漂移的正确手法
  • 鸿蒙Next中使用mDNS发现局域网服务:完整指南与实战
  • 长泰建设局网站注册网站多久
  • 孝感网站开发江苏建设服务信息网站
  • 数据分析概述与环境搭建
  • 易语言网站怎么做帕绍网站建设
  • vue3父组件和子组件之间传递数据
  • Coze源码分析-资源库-编辑工作流-前端源码-核心流程/API/总结
  • Netty服务器监听读写超时
  • PHP 中的正则表达式
  • Linux的Socket编程之UDP
  • 环境没有tomcat怎么演示自己做的网站动漫设计专业就业方向
  • 180课时吃透Go语言游戏后端开发7:Go语言中的函数
  • Python核心架构深度解析:从解释器原理到GIL机制全面剖析
  • 数据结构_哈夫曼编码(Huffman)完整指南:从原理到实现,附考研真题详解
  • 怎样做网站吸引客户网站开发专业就业前系军
  • 四川建站模板网站公司有哪些做任务网站
  • 藏语自然语言处理入门 - 5 文本归类
  • Stanford CS336 assignment1 | Transformer Language Model Architecture
  • 告别人工出题!PromptCoT 2.0 让大模型自己造训练难题,7B 模型仅用合成数据碾压人工数据集效果!
  • Prompt Programming - 用文字重构AI智能体系
  • 基于提示学习的多模态情感分析系统:从MULT到PromptModel的华丽升级
  • Node.js 图形渲染库对比:node-canvas 与 @napi-rs/canvas
  • 【LangChain】P10 LangChain 提示词模板深度解析(一):Prompt Template