【鸿蒙(HarmonyOS)】ArkUI构建布局(线性布局Row/Column、层叠布局Stack、弹性布局Flex、相对布局RelativeContainer)

一、引言

  • 描述:构建布局是UI界面开发的基础,如何使界面看起来优雅简洁?编辑程序时不迷路?都离不开一个好的布局思路习惯
  • 难度:简单
  • 任务:
  • 1、认识线性布局Row/Column、层叠布局Stack、弹性布局Flex、相对布局RelativeContainer
  • 2、拿生活中的一些发布的软件进行练手。

二、构建布局

1、线性布局(Row/Column)

如果布局内子元素为复数个,且能够以某种方式线性排列时优先考虑此布局。

(1)任务

如下图,这是某宝购物软件的个人中心。那么需要使用线性布局设计出其底层模板,标准为图中表示的数字。

在这里插入图片描述

(2)实现

横向布局(Row)

在这里插入图片描述

       纵向布局(Column),这里的实现我比较推荐使用适配器(Adapter),在ArkUI里也提供了组件的方法。为了命题还是按照要求处理需求。

在这里插入图片描述

(3)代码

横向布局(Row)

@Entry
@Component

struct Index {

  build(){
    // 线性布局
    Row(){
      Column({ space: 10 }) {
        Text('横向布局(基础)').fontSize(15).fontColor(Color.Black).width('90%')
        Row().width('98%').height(100).backgroundColor(0xddffdd).borderRadius(15)
        Row().width('98%').height(100).backgroundColor(0xddffdd).borderRadius(15)
        Row().width('98%').height(180).backgroundColor(0xddffdd).borderRadius(15)
      }.width('100%').padding(5)
    }
  }

}

纵向布局(Column)

@Entry
@Component

struct Index {

  build(){
    // 线性布局
    Row(){
      Column({ space: 10 }) {
        Text('横向布局(基础)').fontSize(15).fontColor(Color.Black).width('90%')
        Row({ space:10 }){
          Column({space:10}){
            Text('纵向布局').fontSize(12).fontColor(Color.Black).margin({left:20})
            Row(){
              Row().width(50).height(50).backgroundColor(0xF5DEB3).margin({left:20})
              Row().width(50).height(50).backgroundColor(0xD2B48C).margin({left:10})
              Row().width(50).height(50).backgroundColor(0xF5DEB3).margin({left:10})
            }
          }.alignItems(HorizontalAlign.Start)
        }.width('98%').height(100).backgroundColor(0xddffdd).borderRadius(15)
        Row().width('98%').height(100).backgroundColor(0xddffdd).borderRadius(15)
        Row().width('98%').height(180).backgroundColor(0xddffdd).borderRadius(15)
      }.width('100%').padding(5)
    }
  }

}

2、层叠布局(Stack)

组件需要有堆叠效果时优先考虑此布局,层叠布局的堆叠效果不会占用或影响其他同容器内子组件的布局空间。

(1)任务

       如下图,这是一张我的手机界面应用图,那么我们如何实现最小的图片的层叠效果(以其中的淘某为例)。当然正常设计肯定是适配器+容器思想。

在这里插入图片描述

(2)实现

设计的这个图标有点大,按道理一个容器里一行要有三个,如果设计三个会不会超出容器内部呢?这就需要学习到后面的弹性布局(flex)

在这里插入图片描述

(3)代码

@Entry
@Component

struct Index {

  build(){
    Column(){
      Stack({ alignContent: Alignment.TopStart }) {
        Image($r('app.media.beijin')).width('100%').height('100%')
        Column(){}.width(150).height(150).margin({ left:10,top:50 })
          .backgroundColor('#80dfe5ef').borderRadius(20)
        Image($r('app.media.tao')).width(50).height(50).margin({ left:20,top:60 })
          .backgroundColor('#ffff5001').borderRadius(10)
      }.width('100%').height('100%')
    }
  }

}

3、弹性布局(Flex)

       弹性布局是与线性布局类似的布局方式。区别在于弹性布局默认能够使子组件压缩或拉伸。在子组件需要计算拉伸或压缩比例时优先使用此布局,可使得多个容器内子组件能有更好的视觉上的填充容器效果。

(1)任务

红框内容,使用弹性布局在容器里生成多个APP(模拟)

在这里插入图片描述

(2)实现

在这里插入图片描述

(3)代码

@Entry
@Component

struct Index {

  private arr: string[] = ['APP1', 'APP2', 'APP3', 'APP4', 'APP5'];

  build(){
    Column(){
      Stack({ alignContent: Alignment.TopStart }) {
        Image($r('app.media.beijin')).width('100%').height('100%')
        Column(){
          Flex({ wrap: FlexWrap.Wrap }) {
            ForEach(this.arr, (item) => {
              Text(item)
                .width(35)
                .height(35)
                .fontSize(8)
                .margin(5)
                .textAlign(TextAlign.Center)
                .borderRadius(10)
                .backgroundColor(0xFFFFFF)
            }, item => item)
          }.width('100%').height('100%').margin({ left:10,top:10 })
        }.width(150).height(150).margin({ left:10,top:50 })
        .backgroundColor('#80dfe5ef').borderRadius(20)
      }.width('100%').height('100%')
    }
  }

}

4、相对布局(RelativeContainer)

       相对布局是在二维空间中的布局方式,不需要遵循线性布局的规则,布局方式更为自由。通过在子组件上设置锚点规则(AlignRules)使子组件能够将自己在横轴、纵轴中的位置与容器或容器内其他子组件的位置对齐。设置的锚点规则可以天然支持子元素压缩、拉伸,堆叠或形成多行效果。在页面元素分布复杂或通过线性布局会使容器嵌套层数过深时推荐使用。

(1)任务

将命名相对定位在容器之下

在这里插入图片描述

(2)实现

在这里插入图片描述

(3)代码

@Entry
@Component

struct Index {

  private arr: string[] = ['APP1', 'APP2', 'APP3', 'APP4', 'APP5'];

  build(){
    Column(){
      Stack({ alignContent: Alignment.TopStart }) {
        Image($r('app.media.beijin')).width('100%').height('100%')
        Column(){
          Flex({ wrap: FlexWrap.Wrap }) {
            ForEach(this.arr, (item) => {
              Text(item)
                .width(35)
                .height(35)
                .fontSize(8)
                .margin(5)
                .textAlign(TextAlign.Center)
                .borderRadius(10)
                .backgroundColor(0xFFFFFF)
            }, item => item)
          }.width('100%').height('100%').margin({ left:10,top:10 }).id('row')
          // 将命名定位在容器下面
          Row() {
            Text('应用')
          }.alignRules({
            top: { anchor: 'row', align: VerticalAlign.Bottom },
          })

        }.width(150).height(150).margin({ left:10,top:50 })
        .backgroundColor('#80dfe5ef').borderRadius(20)
      }.width('100%').height('100%')
    }
  }

}

5、栅格布局

关于栅格布局主要还是适配横纵屏,这就涉及到了后面的兼容问题,这里就先不写,用于后面的项目实际中展示。

<think>好的,用户想了解Flutter布局的相关知识和解决布局问题,特别是教程和示例。我需要先整理已有的引用内容,看看哪些信息可以直接帮助用户。 根据提供的引用,引用[3]提到了Flutter的线性布局,使用RowColumn,类似于Android的LinearLayout,还提到主轴和纵轴的概念。引用[4]介绍了Alignment类,可能和布局的对齐方式有关。引用[5]强调了Flutter用代码构建UI,Widget是基本单元,组合现有Widget来创建复杂界面。 用户可能需要基础的布局概念,比如RowColumn,以及更复杂的布局组件如Stack、Expanded、Flexible等。可能需要解释主轴和交叉轴,这对理解布局排列很重要。此外,示例代码会有帮助,比如如何组合这些Widgets。 引用中有提到Flutter Gallery作为官方示例应用,引用[1]和[2],可以推荐用户参考这些资源。另外,布局构建的实践步骤可能需要分点说明,比如从线性布局弹性布局再到层叠布局,然后讨论对齐和嵌套组合。 需要确保回答结构清晰,分步骤讲解,并包含示例代码。同时,根据用户可能的后续问题,生成相关问题,比如性能优化、常见问题解决、复杂布局实现等。 需要检查引用的正确性,比如引用[3]详细说明了RowColumn,引用[4]关于Alignment的信息是否足够。如果有不足的地方,可能需要补充,但根据现有引用,应该足够覆盖基础布局知识。 最后,确保使用中文回答,LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但看起来布局部分可能不需要数学公式,所以可能用不上。但需要遵循其他格式要求,如代码块和引用标识。</think>### Flutter布局核心教程 Flutter布局体系基于Widget组合,主要通过以下四类基础布局实现界面构建: 一、**线性布局体系** 1. `Row/Column`组件实现水平/垂直排列 ```dart Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, // 主轴对齐 crossAxisAlignment: CrossAxisAlignment.center, // 交叉轴对齐 children: [Widget1, Widget2], ) ``` 2. `Expanded`组件实现弹性空间分配 ```dart Row( children: [ Expanded(flex: 2, child: WidgetA), // 占2/3空间 Expanded(flex: 1, child: WidgetB), // 占1/3空间 ] ) ``` 二、**弹性布局体系** 1. `Flex`组件配合`Flexible`实现动态布局 ```dart Flex( direction: Axis.vertical, children: [ Flexible(fit: FlexFit.tight, child: TopSection()), Flexible(fit: FlexFit.loose, child: BottomSection()) ] ) ``` 三、**层叠布局体系** 1. `Stack`组件实现元素叠加 ```dart Stack( alignment: Alignment.bottomRight, // 子组件对齐方式[^4] children: [ BackgroundWidget(), Positioned( top: 10, left: 20, child: FloatingButton() ) ] ) ``` 四、**约束布局体系** 1. `ConstrainedBox`设置尺寸约束 ```dart ConstrainedBox( constraints: BoxConstraints( minWidth: 100, maxHeight: 200 ), child: CustomWidget() ) ``` **布局调试技巧**: - 使用`DebugPaintSizeEnabled`可视化布局边框 - 通过`LayoutBuilder`获取父级约束条件 - 使用`AspectRatio`保持特定宽高比 **推荐学习路径**: 1. 通过Flutter Gallery[^1]查看官方布局示例 2. 在Flutter-examples[^2]仓库中实践布局组合 3. 使用DevTools实时预览布局结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端new守夜人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值