鸿蒙开发:弹性布局Flex

前言

代码案例基于Api13。

正在开发一个搜索组件,其中一个功能是针对历史搜索的内容进行展示,由于搜索的内容长度不一,需要进行流式布局展示,效果如下:

以上的效果,相信大家在很多的应用里或多或少都见到过,那么在鸿蒙当中如何实现呢?也是非常的简单,系统给我们提供弹性布局Flex,使用它,可以帮助我们快速的进行实现。

@Entry
  @Component
  struct Index {
    @State searchList: string[] = ["程序员一鸣", "App开发干货铺", "程序员修养", "鸿蒙4.0", "HarmonyOS NEXT","开发","中","这是一个非常长的搜索内容,请须知!"]

    build() {
      Column() {

        Text("历史搜索")
          .fontSize(18)
          .fontColor(Color.Black)
          .fontWeight(FontWeight.Bold)

        Flex({ wrap: FlexWrap.Wrap }) { 
          ForEach(this.searchList, (item: string) => {
            Text(item)
              .backgroundColor("#e8e8e8")
              .padding({
                left: 10,
                right: 10,
                top: 5,
                bottom: 5
              }).margin({ right: 10, bottom: 10 })
              .borderRadius(5)
          })
        }.margin({ top: 10 })
      }
      .height('100%')
        .width('100%')
        .padding({ left: 10, right: 10 })
        .alignItems(HorizontalAlign.Start)
        .justifyContent(FlexAlign.Center)
    }
  }

什么是Flex

一句话解读:主要对容器中的子元素进行排列、对齐和分配剩余空间;它允许开发者通过简单的属性设置来实现复杂的布局效果,其核心思想就是让容器能够根据子元素的大小和排列方式自动调整布局,从而实现灵活的界面设计。

主要特点有,灵活性:Flex布局可以根据容器的大小自动调整子元素的排列方式和大小。方向性:Flex布局支持水平和垂直两种排列方向,开发者可以根据需要选择合适的排列方式。对齐方式:Flex布局提供了多种对齐方式,如居中、两端对齐、等间距对齐等,方便开发者实现各种复杂的布局效果。

它有主轴和交叉轴概念,所谓的主轴就是水平方向,交叉轴就是垂直方向,主轴开始的位置称为主轴起始点,结束位置称为主轴结束点,交叉轴开始的位置称为交叉轴起始点,结束位置称为交叉轴结束点。

使用方式

简单使用方式如下:

Flex({ direction: FlexDirection.Row }) {
        Text('元素1')
          .padding(10)
          .backgroundColor(Color.Red)
        Text('元素2')
          .padding(10)
          .backgroundColor(Color.Pink)
        Text('元素3')
          .padding(10)
          .backgroundColor(Color.Orange)
      }

控制方向

通过direction属性来控制子元素的方向,目前有四个可选项。

名称

说明

Row

主轴与行方向一致作为布局模式。

RowReverse

与Row方向相反方向进行布局。

Column

主轴与列方向一致作为布局模式。

ColumnReverse

与Column相反方向进行布局。

Row

代码:

Flex({ direction: FlexDirection.Row }) {
        Text('元素1')
          .padding(10)
          .backgroundColor(Color.Red)
        Text('元素2')
          .padding(10)
          .backgroundColor(Color.Pink)
        Text('元素3')
          .padding(10)
          .backgroundColor(Color.Orange)
      }

效果:

RowReverse

代码:

 Flex({ direction: FlexDirection.RowReverse }) {
        Text('元素1')
          .padding(10)
          .backgroundColor(Color.Red)
        Text('元素2')
          .padding(10)
          .backgroundColor(Color.Pink)
        Text('元素3')
          .padding(10)
          .backgroundColor(Color.Orange)
      }

效果:

Column

代码:

      Flex({ direction: FlexDirection.Column }) {
        Text('元素1')
          .padding(10)
          .backgroundColor(Color.Red)
        Text('元素2')
          .padding(10)
          .backgroundColor(Color.Pink)
        Text('元素3')
          .padding(10)
          .backgroundColor(Color.Orange)
      }

效果:

ColumnReverse

代码:

      Flex({ direction: FlexDirection.ColumnReverse }) {
        Text('元素1')
          .padding(10)
          .backgroundColor(Color.Red)
        Text('元素2')
          .padding(10)
          .backgroundColor(Color.Pink)
        Text('元素3')
          .padding(10)
          .backgroundColor(Color.Orange)
      }

效果:

控制行/列

通过wrap属性,来控制是单行/列还是多行/列排列,有三个参数可选择。

名称

说明

NoWrap

Flex容器的元素单行/列布局,子元素尽可能约束在容器内。当子元素有最小尺寸约束等设置时,Flex容器不会对其强制弹性压缩。

Wrap

Flex容器的元素多行/列排布,子项允许超出容器。

WrapReverse

Flex容器的元素反向多行/列排布,子项允许超出容器。

加上wrap属性,则就允许实现多行/列排布。

Flex({ direction: FlexDirection.Row,wrap:FlexWrap.Wrap}) {
        Text('元素1')
          .width(100)
          .padding(10)
          .backgroundColor(Color.Red)
        Text('元素2')
          .padding(10)
          .width(100)
          .backgroundColor(Color.Pink)
        Text('元素3')
          .padding(10)
          .width(100)
          .backgroundColor(Color.Orange)
        Text('元素4')
          .padding(10)
          .width(100)
          .backgroundColor(Color.Gray)
      }

我们看下效果,当子元素超出容器宽度时,会自动换行。

对齐方式

对其方式,有两种,一种是主轴方向,一种是交叉轴方向,主轴方向使用justifyContent属性,交叉轴方向使用alignItems。

justifyContent

名称

说明

Start

元素在主轴方向首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐。

Center

元素在主轴方向中心对齐,第一个元素与行首的距离与最后一个元素与行尾距离相同。

End

元素在主轴方向尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐。

SpaceBetween

Flex主轴方向均匀分配弹性元素,相邻元素之间距离相同。第一个元素与行首对齐,最后一个元素与行尾对齐。

SpaceAround

Flex主轴方向均匀分配弹性元素,相邻元素之间距离相同。第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半。

SpaceEvenly

Flex主轴方向均匀分配弹性元素,相邻元素之间的距离、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样。

alignItems

名称

说明

Auto

使用Flex容器中默认配置。

Start

元素在Flex容器中,交叉轴方向首部对齐。

Center

元素在Flex容器中,交叉轴方向居中对齐。

End

元素在Flex容器中,交叉轴方向底部对齐。

Stretch

元素在Flex容器中,交叉轴方向拉伸填充。容器为Flex且设置Wrap为FlexWrap.Wrap或FlexWrap.WrapReverse时,元素拉伸到与当前行/列交叉轴长度最长的元素尺寸。其余情况下,无论元素尺寸是否设置,均拉伸到容器尺寸。

Baseline

元素在Flex容器中,交叉轴方向文本基线对齐。

子元素属性

除了通过Flex容器来控制之外,里面子元素也可以自由控制占位情况,比如通过flexGrow来分配剩余空间的比例,通过flexShrink,来压缩比例(默认1,可压缩)通过alignSelf来覆盖容器的交叉轴对齐方式。

比如,我们给第三个元素,设置完全占用剩余空间:

Flex({ direction: FlexDirection.Row }) {
        Text('元素1')
          .width(100)
          .padding(10)
          .backgroundColor(Color.Red)
        Text('元素2')
          .padding(10)
          .width(100)
          .backgroundColor(Color.Pink)
        Text('元素3')
          .padding(10)
          .width(100)
          .flexGrow(1)
          .backgroundColor(Color.Orange)
      }

查看效果:

相关总结

在实际的开发中,需要掌握主轴与交叉轴的关系、换行规则及子元素属性,同时注意性能与兼容性问题,还有一点,Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替。

【资源说明】 1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 本文介绍了基于QEM(Quadric Error Metrics,二次误差度量)的优化网格简化算法的C和C++实现源码及其相关文档。这一算法主要应用于计算机图形学领域,用于优化三维模型的多边形数量,使之在保持原有模型特征的前提下实现简化。简化的目的是为了提高渲染速度,减少计算资源消耗,以及便于网络传输等。 本项目的核心是网格简化算法的实现,而QEM作为该算法的核心,是一种衡量简化误差的数学方法。通过计算每个顶点的二次误差矩阵来评估简化操作的误差,并以此来指导网格简化过程。QEM算法因其高效性和准确性在计算机图形学中广泛应用,尤其在实时渲染和三维打印领域。 项目代码包含C和C++两种语言版本,这意味着它可以在多种开发环境中运行,增加了其适用范围。对于计算机相关专业的学生、教师和行业从业者来说,这个项目提供了丰富的学习和实践机会。无论是作为学习编程的入门材料,还是作为深入研究计算机图形学的项目,该项目都具有实用价值。 此外,项目包含的论文文档为理解网格简化算法提供了理论基础。论文详细介绍了QEM算法的原理、实施步骤以及与其他算法的对比分析。这不仅有助于加深对算法的理解,也为那些希望将算法应用于自己研究领域的人员提供了参考资料。 资源说明文档强调了项目的稳定性和可靠性,并鼓励用户在使用过程中提出问题或建议,以便不断地优化和完善项目。文档还提醒用户注意查看,以获取使用该项目的所有必要信息。 项目的文件名称列表中包含了加水印的论文文档、资源说明文件和实际的项目代码目录,后者位于名为Mesh-Simplification-master的目录下。用户可以将这些资源用于多种教学和研究目的,包括课程设计、毕业设计、项目立项演示等。 这个项目是一个宝贵的资源,它不仅提供了一个成熟的技术实现,而且为进一步的研究和学习提供了坚实的基础。它鼓励用户探索和扩展,以期在计算机图形学领域中取得更深入的研究成果。
【资源说明】 1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 本文介绍了基于QEM(Quadric Error Metrics,二次误差度量)的优化网格简化算法的C和C++实现源码及其相关文档。这一算法主要应用于计算机图形学领域,用于优化三维模型的多边形数量,使之在保持原有模型特征的前提下实现简化。简化的目的是为了提高渲染速度,减少计算资源消耗,以及便于网络传输等。 本项目的核心是网格简化算法的实现,而QEM作为该算法的核心,是一种衡量简化误差的数学方法。通过计算每个顶点的二次误差矩阵来评估简化操作的误差,并以此来指导网格简化过程。QEM算法因其高效性和准确性在计算机图形学中广泛应用,尤其在实时渲染和三维打印领域。 项目代码包含C和C++两种语言版本,这意味着它可以在多种开发环境中运行,增加了其适用范围。对于计算机相关专业的学生、教师和行业从业者来说,这个项目提供了丰富的学习和实践机会。无论是作为学习编程的入门材料,还是作为深入研究计算机图形学的项目,该项目都具有实用价值。 此外,项目包含的论文文档为理解网格简化算法提供了理论基础。论文详细介绍了QEM算法的原理、实施步骤以及与其他算法的对比分析。这不仅有助于加深对算法的理解,也为那些希望将算法应用于自己研究领域的人员提供了参考资料。 资源说明文档强调了项目的稳定性和可靠性,并鼓励用户在使用过程中提出问题或建议,以便不断地优化和完善项目。文档还提醒用户注意查看,以获取使用该项目的所有必要信息。 项目的文件名称列表中包含了加水印的论文文档、资源说明文件和实际的项目代码目录,后者位于名为Mesh-Simplification-master的目录下。用户可以将这些资源用于多种教学和研究目的,包括课程设计、毕业设计、项目立项演示等。 这个项目是一个宝贵的资源,它不仅提供了一个成熟的技术实现,而且为进一步的研究和学习提供了坚实的基础。它鼓励用户探索和扩展,以期在计算机图形学领域中取得更深入的研究成果。
### 实现 HarmonyOS 弹性布局的核心概念 在 HarmonyOS 的开发过程中,弹性布局Flex Layout)是一种强大的工具,能够帮助开发者高效地管理界面元素的位置和大小。通过 `Flex` 容器组件及其属性设置,可以灵活调整子元素的排列方式、对齐策略以及剩余空间的分配。 以下是实现弹性布局的关键点: #### 1. 使用 Flex 组件定义容器 Flex 布局的基础在于创建一个 Flex 容器,并在其内部放置多个子元素。这些子元素会按照指定的方向自动排列并适配可用的空间[^2]。 ```xml <Div class="container"> <Flex> <!-- 子元素 --> <Text>Item 1</Text> <Text>Item 2</Text> <Text>Item 3</Text> </Flex> </Div> ``` #### 2. 设置 Flex 属性控制布局行为 Flex 提供了一系列可配置选项来定制化布局效果,主要包括以下几个方面: - **direction**: 控制主轴方向,默认为水平方向 (`row`) 或垂直方向 (`column`)。 - **wrap**: 决定当子元素超出容器宽度时是否换行。 - **justifyContent**: 主轴上的对齐方式,例如居中、两端对齐等。 - **alignItems**: 交叉轴上的对齐方式,例如顶部对齐、底部对齐等。 - **alignContent**: 当存在多行时,决定各行列之间的间距分布。 下面是一个完整的示例代码片段展示如何应用上述属性: ```javascript @Entry @Component struct ExampleLayout { build() { Column({ space: 8 }) { Text('HarmonyOS Elastic Layout Demo') .fontSize(20).fontColor('#FFFFFF').padding(16) Flex({ direction: FlexDirection.Row, wrap: FlexWrap.Wrap, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) { ForEach([1, 2, 3], (item) => { Text(`Item ${item}`) .width('auto') .height(50) .backgroundColor(Color.Gray) .textAlign(TextAlign.Center) .margin({ top: 8 }) }, item => `${item}`) } }.width('100%').height('100%').backgroundColor(Color.Black) } } ``` 此代码实现了如下功能: - 创建了一个 Flex 容器,其主轴方向为横向排列; - 启用了换行模式以便容纳更多项目; - 将子项沿主轴均匀间隔布置,并保持它们在交叉轴上中心对齐。 #### 3. 应用场景举例 弹性布局非常适合处理动态内容或响应式设计需求。比如,在构建导航条时可以让按钮平均分布在屏幕上;或者在一个列表视图里让每组数据紧凑显示而不会因为屏幕尺寸变化导致错乱[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员一鸣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值