鸿蒙开发:弹性布局Flex
前言
代码案例基于Api13。
正在开发一个搜索组件,其中一个功能是针对历史搜索的内容进行展示,由于搜索的内容长度不一,需要进行流式布局展示,效果如下:

以上的效果,相信大家在很多的应用里或多或少都见到过,那么在鸿蒙当中如何实现呢?也是非常的简单,系统给我们提供弹性布局Flex,使用它,可以帮助我们快速的进行实现。
@Entry@Componentstruct 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代替。
相关文章:
鸿蒙开发:弹性布局Flex
前言 代码案例基于Api13。 正在开发一个搜索组件,其中一个功能是针对历史搜索的内容进行展示,由于搜索的内容长度不一,需要进行流式布局展示,效果如下: 以上的效果,相信大家在很多的应用里或多或少都见到过…...
【DeepSeek】5分钟快速实现本地化部署教程
一、快捷部署 (1)下载ds大模型安装助手,下载后直接点击快速安装即可。 https://file-cdn-deepseek.fanqiesoft.cn/deepseek/deepseek_28348_st.exe (2)打开软件,点击立即激活 (3)选…...
易基因特异性R-loop检测整体研究方案
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 01.技术简述 R-loop是由DNA:RNA 杂交体和被置换的单链DNA组成的三链核酸结构,广泛参与基因转录、表观遗传调控及DNA修复等关键生物学过程。异常的R-loop积累会导致基因组不稳…...
虚拟系统配置案例
安全策略要求: 1、只存在一个公网IP地址,公司内网所有部门都需要借用同一个接口访问外网 2、财务部禁止访问Internet,研发部门只有部分员工可以访问Internet,行政部门全部可以访问互联网 3、为三个部门的虚拟系统分配相同的资源类…...
C语言【进阶篇】之结构体 —— 从基础声明到复杂应用的进阶之路
目录 🚀前言✍️结构体类型的声明💯结构体定义💯结构的特殊声明 🦜结构的自引用💻结构体内存对齐💯对齐规则💯为什么存在内存对齐💯修改默认对齐数 🐍结构体传参…...
Python-列表和元组
列表 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可. 但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候, 就需要用到列表. 列表是一种让程序猿在代…...
PyTorch 中的混合精度训练方法,从 autocast 到 GradScalar
PyTorch 的混合精度训练主要由两个方法实现:amp.autocast 和 amp.GradScalar。在这两个工具的帮助下,可以实现以 torch.float16 的混合精度训练。当然,这两个方法都是模块化并且通常都会一起调用,但并不一定总是需要一起使用。 参…...
分享能在线运行C语言的网站
https://www.onlinegdb.com/# 我用vscode运行c语言总是报错,后面找到这个网站,可以在线调试和保存代码。 如下图,程序的效果是给变量x,y,z赋值,并打印出来。代码输入以后,右上角选择C语言&…...
AI-Deepseek + PPT
01--Deepseek提问 首先去Deepseek问一个问题: Deepseek的回答: 在汽车CAN总线通信中,DBC文件里的信号处理(如初始值、系数、偏移)主要是为了 将原始二进制数据转换为实际物理值,确保不同电子控制单元&…...
MacOS Big Sur 11 新机安装brew wget python3.12 exo
MacOS Big Sur 11,算是很老的系统了,所以装起来有点费劲。 首先安装brew 按照官网的方法,直接执行下面语句即可安装: export HOMEBREW_BREW_GIT_REMOTE"https://githubfast.com" # put your Git mirror of Homebrew/brew here …...
十大经典排序算法简介
一 概述 本文对十大经典排序算法做简要的总结(按常用分类方式排列),包含核心思想、时间/空间复杂度及特点。 二、比较类排序 1. 冒泡排序 (BUBBLE SORT) 思想:重复交换相邻逆序元素,像气泡上浮 复杂度: 时间:O(n^2)(最好情况O(n)) 空间:O(1) 特点:简单但效率低,稳…...
不小心更改了/etc权限为777导致sudo,ssh等软件都无法使用
修复流程 一、进入恢复模式(无网络或无法登录时必选) 1.重启系统,在 GRUB 启动菜单选择 Recovery Mode(按 Shift 或 Esc 呼出菜单)。2.以 root 身份挂载为可读写: bash 复制 mount -o remount,rw /确保文…...
AI档案审核2
以下是一个结合计算机视觉(CV)和自然语言处理(NLP)的智能档案审核系统完整实现方案,包含可落地的代码框架和技术路线: 一、系统架构设计 #mermaid-svg-UhBtIPrNXo5P89Zb {font-family:"trebuchet ms&q…...
【基础1】冒泡排序
核心思想 冒泡排序是通过相邻元素的连续比较和交换,使得较大的元素逐渐"浮"到数组的末尾,如同水中气泡上浮的过程 特点: 每轮遍历将最大的未排序元素移动到正确位置稳定排序:相等元素的相对位置保持不变原地排序…...
Trae AI 开发工具使用手册
这篇手册将介绍 Trae 的基本功能、安装步骤以及使用方法,帮助开发者快速上手这款工具。 Trae AI 开发工具使用手册 Trae 是字节跳动于 2025 年推出的一款 AI 原生集成开发环境(IDE),旨在通过智能代码生成、上下文理解和自动化任务…...
揭开AI-OPS 的神秘面纱 第二讲-技术架构与选型分析 -- 数据采集层技术架构与组件选型分析
基于上一讲预设的架构图,深入讨论各个组件所涉及的技术架构、原理以及选型策略。我将逐层、逐组件地展开分析,并侧重于使用数据指标进行技术选型的对比。 我们从 数据采集层 开始,进行最细粒度的组件分析和技术选型比对。 数据采集层技术架构…...
基于Docker去创建MySQL的主从架构
基于Docker去创建MySQL的主从架构 用于开发与测试环境读写分离 主从的架构搭建步骤 基于Docker去创建MySQL的主从架构 # 创建主从数据库文件夹 mkdir -p /usr/local/mysql/master1/conf mkdir -p /usr/local/mysql/master1/data mkdir -p /usr/local/mysql/slave1/conf mkd…...
操作系统 2.2-多进程总体实现
多个进程使用CPU的图像 如何使用CPU呢? 通过让程序执行起来来使用CPU。 如何充分利用CPU呢? 通过启动多个程序,交替执行来充分利用CPU。 启动了的程序就是进程,所以是多个进程推进 操作系统需要记录这些进程,并按照…...
Jasypt 与 Spring Boot 集成文档
Jasypt 与 Spring Boot 集成文档 目录 简介版本说明快速开始 添加依赖配置加密密钥加密配置文件 高级配置 自定义加密算法多环境配置 最佳实践常见问题参考资料 简介 Jasypt 是一个简单易用的 Java 加密库,支持与 Spring Boot 无缝集成。通过 Jasypt,…...
在CentOS系统上安装Conda的详细指南
前言 Conda 是一个开源的包管理系统和环境管理系统,广泛应用于数据科学和机器学习领域。本文将详细介绍如何在 CentOS 系统上安装 Conda,帮助您快速搭建开发环境。 准备工作 在开始安装之前,请确保您的 CentOS 系统已经满足以下条件&#x…...
FPGA开发入门:从零开始用Vivado实现LED流水灯项目
1. 项目概述与核心价值最近在后台和社群里,看到不少刚接触FPGA开发的朋友,特别是从单片机或嵌入式软件转过来的,对于如何上手第一个完整的FPGA项目感到有些迷茫。大家常问:“我学了Verilog语法,也跑过仿真了࿰…...
Taotoken Token Plan套餐在实际开发中的成本控制体感
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken Token Plan套餐在实际开发中的成本控制体感 1. 套餐选择与预算锚定 在项目开发初期,团队或个人开发者面临的…...
从Crustocean/conch看轻量级工作流编排:DAG原理与Python实现
1. 项目概述:从“Crustocean/conch”看现代数据管道编排的演进最近在梳理团队的数据处理流程时,我又一次被那些错综复杂的脚本、定时任务和手动依赖检查搞得焦头烂额。这让我想起了几年前第一次接触“Crustocean/conch”这个项目时的情景。当时ÿ…...
如何永久保存微信聊天记录?WeChatMsg终极解决方案完全指南
如何永久保存微信聊天记录?WeChatMsg终极解决方案完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...
地平线X3M平台sensor点亮故障排查实战指南
1. 地平线X3M平台sensor点亮常见问题概述 第一次接触地平线X3M平台的开发者,在点亮sensor时经常会遇到各种"拦路虎"。我刚开始接触这个平台时,光是调试一个imx415 sensor就花了整整三天时间。现在回想起来,大部分问题其实都有规律可…...
观察Taotoken用量看板如何帮助团队控制API成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察Taotoken用量看板如何帮助团队控制API成本 作为团队的技术负责人,引入大模型API后,成本的可观测性与可…...
接口响应慢排查指南:从分层框架到实战优化
1. 问题定位:从现象到根源的排查框架接口响应慢,这几乎是每个后端开发者、运维工程师乃至测试同学都会遇到的“经典”问题。它不像一个明确的错误,会直接抛出异常或返回错误码,而是像一个隐形的性能瓶颈,悄无声息地拖慢…...
电子行业市场机会识别与产品落地实战指南
1. 市场机会的本质:从“风口”到“价值锚点”的认知重塑“市场机会”这四个字,在电子行业里听得耳朵都快起茧了。从投资人到创业者,从工程师到销售,人人都在谈论它。但说实话,很多人对这个词的理解,还停留在…...
Cursor AI破解工具技术深度解析:如何实现设备标识重置与Pro功能永久激活
Cursor AI破解工具技术深度解析:如何实现设备标识重置与Pro功能永久激活 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve…...
RK3568平台开发系列讲解(热拔插篇)内核是如何发送事件到用户空间
🚀返回专栏总目录 文章目录 一、相关接口函数 二、udevadm 命令 三、实验程序 四、运行效果 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、相关接口函数 kobject_uevent 是 Linux 内核中的一个函数, 用于生成和发送 uevent 事件。 它是 udev 和其他设备管理工具与…...
