鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)
在鸿蒙ArkTS中,布局容器组件有很多,常见的有:
⑴ Column:(垂直布局容器):用于将子组件垂直排列。
⑵ Row:(水平布局容器):用于将子组件水平排列。
⑶ Flex:(弹性布局方式)它提供了更加有效的方法对容器中的子元素进行排列、对齐和分配剩余空间。
⑷ Stack:Stack布局是一种可以将多个组件按照一定顺序叠放的布局。
⑸ Grid(网格容器):用于创建二维网格布局,适合需要行列对齐的复杂布局。
⑹ List(列表容器):用于展示列表数据,可以设置列表项的布局和样式。
⑺ Tabs(页签容器):用于创建页签布局,允许用户在不同的页面或视图间切换。
⑻ Swiper(滑块视图容器):用于创建滑动视图,常用于图片轮播或广告等场景。
⑼ Scroll(可滑动的容器):允许用户滚动查看超出视图范围的内容。
⑽ RelativeContainer(相对布局容器):允许子元素相对于容器或指定的兄弟元素进行定位。
⑾ Position(定位布局):使用Position组件进行绝对或相对定位。
上面的11中布局容器组件各有特点,共同的特性是:
⑴ 空间分配属性(如space):用于调整子组件之间的间距。
⑵ 对齐属性(如justifyContent和alignItems):用于设置子组件在主轴和交叉轴方向上的对齐方式。
⑶ 尺寸属性(如width和height):用于设置容器的宽度和高度。
⑷ 边距和填充(如padding和margin):用于设置容器的内边距和外边距。
⑸ 其他属性,比如背景色等。
可以一起学习,方便对比。
一、Column和Row
Column和Row都是线性布局方式。
Column组件:用于创建垂直方向的线性布局,其子组件会按照从上到下的顺序排列。
Row组件:用于创建水平方向的线性布局,其子组件会按照从左到右的顺序排列。
常用属性:
① width:设置组件的宽度。
② height:设置组件的高度。
③ alignment:设置子组件在垂直方向上的对齐方式(如顶部对齐、底部对齐、居中对齐等)。
④ spacing:设置子组件之间的间距。
⑤ backgroundColor:设置组件的背景颜色。
⑥ padding:设置组件的内边距。
⑦ Row组件的特有属性wrap:设置是否允许子组件换行(当子组件总宽度超过Row宽度时)。
做一个2行三列的宫格布局,使用Column和Row。
// 获取随机颜色的函数
function getRandomColor() {const letters :string= '0123456789ABCDEF';let color:string = '#';for (let i = 0; i < 6; i++) {let Itemp:number=Math.floor(Math.random() * 16)color += letters.substr(Itemp,1);}return color;
}@Entry
@Component
struct Index {str:string='在鸿蒙ArkTS中,Column和Row是两种常用的布局容器组件,它们分别用于垂直和水平布局。Column(垂直布局容器)用于将子组件垂直排列,Row(水平布局容器)用于将子组件水平排列。'build() {Column() {Row(){Column(){Text(this.str).fontSize(18).fontColor(getRandomColor()).textAlign(TextAlign.Center).maxLines(4).textOverflow({overflow:TextOverflow.Ellipsis})}.layoutWeight(1).height('100%').justifyContent(FlexAlign.Center)Column(){Text(this.str).fontSize(18).fontColor(getRandomColor()).align(Alignment.Center)}.layoutWeight(1).height('100%').justifyContent(FlexAlign.Center)Column(){Text(this.str).fontSize(18).fontColor(getRandomColor())}.layoutWeight(1).height('100%').justifyContent(FlexAlign.Center)}.height('50%')Row(){Column(){Text(this.str).fontSize(18).fontColor(getRandomColor())}.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).layoutWeight(1).height('100%')Column(){Text(this.str).fontSize(18).fontColor(getRandomColor())}.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).layoutWeight(1).height('100%')Column(){Text(this.str).fontSize(18).fontColor(getRandomColor())}.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).layoutWeight(1).height('100%')}.height('50%')}.width('100%').height('100%')}
}
效果图:

代码写得有些乱,主要是公共的属性太多,可以使用@style和@Extend来优化代码,并且还可以提供变化的灵活性。
下面的代码@Style只是展示一种写法,主要是@Extend(组件)的写法。
function getRandomColor() {const letters :string= '0123456789ABCDEF';let color:string = '#';for (let i = 0; i < 6; i++) {let Itemp:number=Math.floor(Math.random() * 16)color += letters.substr(Itemp,1);}return color;
}
@Extend(Text) function CustomText() {.fontColor(getRandomColor()).fontSize(18).textAlign(TextAlign.Center).maxLines(5).textOverflow({ overflow: TextOverflow.Ellipsis })
}
@Extend(Column) function ColumnCustomAttr(){.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)
}@Entry
@Component
struct Index {str: string = '在鸿蒙ArkTS中,Column和Row是两种常用的布局容器组件,它们分别用于垂直和水平布局。Column(垂直布局容器)用于将子组件垂直排列,Row(水平布局容器)用于将子组件水平排列。'@StylesCommonStyle() {.layoutWeight(1).height('100%').padding({top:5,left:5,right:5,bottom:5}).margin({top:5,left:5,right:5,bottom:5}).border({width:2,color:getRandomColor()})}build() {Column() {Row() {Column() { Text(this.str).CustomText().CommonStyle() }.CommonStyle().ColumnCustomAttr()Column() { Text(this.str).CustomText() }.CommonStyle().ColumnCustomAttr()Column() { Text(this.str).CustomText() }.CommonStyle().ColumnCustomAttr()}.height('50%')Row() {Column() { Text(this.str).CustomText() }.CommonStyle().ColumnCustomAttr()Column() { Text(this.str).CustomText().CommonStyle() }.CommonStyle().ColumnCustomAttr()Column() { Text(this.str).CustomText() }.CommonStyle().ColumnCustomAttr()}.height('50%')}.width('100%').height('100%')}
}
上面的代码就整洁了一些,而且方便修改,无论修改的是公共属性还是组件独有属性。
实际效果图:

二、Flex(弹性布局组件)
Flex布局是一种二维布局模型,它可以在任意方向上对元素进行排列,并且可以动态地调整元素的大小和位置,以适应不同的屏幕尺寸和设备。通过使用Flex布局,可以实现响应式布局效果。
Flex(弹性伸缩布局)组件当容器的宽或者高超出父容器时会默认进行压缩显示。Row相当于Flex中的主轴,Column相当于Flex中的交叉轴。
Flex主要属性:
① direction(主轴的方向):用于指定子组件在Flex容器上排列的方向,即主轴的方向。可选值包括Row(主轴方向为水平向右)、RowReverse(主轴方向为水平向左)、Column(主轴方向为垂直向下)和ColumnReverse(主轴方向为垂直向上)。
② justifyContent(主轴的对齐方式):用于定义所有子组件在Flex容器主轴上的对齐方式。,可选值:justifyContent:FlexAlign.Start / Center / End / SpaceBetween / SpaceAround / SpaceEvenly,共有6种方式。
③ alignItems(交叉轴的对弃方式):用于定义所有子组件在Flex容器交叉轴上的对齐方式。可选值:alignItems.Auto / Start / Center / End / Baseline /Stretch,共有6种方式。
④ wrap(布局换行):用于确定Flex容器是单行/列排列还是多行/列排列。在多行布局时,它还会通过交叉轴方向确定新行的堆叠方向。可选值:wrap:FlexWrap.NoWrap / Wrap / WrapReverse。
演示:
function getRandomColor() {const letters :string= '0123456789ABCDEF';let color:string = '#';for (let i = 0; i < 6; i++) {let Itemp:number=Math.floor(Math.random() * 16)color += letters.substr(Itemp,1);}return color;
}
@Extend(Text) function CustomText() {.fontColor(getRandomColor()).fontSize(18).textAlign(TextAlign.Center).maxLines(5).textOverflow({ overflow: TextOverflow.Ellipsis }).margin(5).padding(5).height('50%').width('30%').border({width:2,color:getRandomColor()})
}
@Entry
@Component
struct Index {str: string = 'Flex(弹性伸缩布局)组件当容器的宽或者高超出父容器时会默认进行压缩显示。Row相当于Flex中的主轴,Column相当于Flex中的交叉轴。'build() {Flex({wrap:FlexWrap.Wrap}){Text(this.str).CustomText()Text(this.str).CustomText()Text(this.str).CustomText()Text(this.str).CustomText()Text(this.str).CustomText()Text(this.str).CustomText()}.height('100%').width('100%')}
}
效果图:

三、Stack(层叠布局组件)
Stack布局是一种可以将多个组件按照一定顺序叠放的布局。在Stack布局中,后添加的组件会自动覆盖前面添加的组件,可以通过设置zIndex控制层级。
① 层叠效果:组件需要有堆叠效果时优先考虑此布局,层叠布局的堆叠效果不会占用或影响其他同容器内子组件的布局空间。
② zIndex控制:通过设置子组件的zIndex可以控制层级,zIndex越大越在上层。
③ 动画支持:Stack布局还支持添加动画,通过动画可以实现组件的平移、旋转等动态效果。
Stack主要的布局属性:alignContent:Alignment.Bottom / ToStart / Top / TopEnd / Start / End / Center / BottomSatrt /Bottom / BottomEnd 共有9种样式
测试代码:
function getRandomColor() {const letters :string= '0123456789ABCDEF';let color:string = '#';for (let i = 0; i < 6; i++) {let Itemp:number=Math.floor(Math.random() * 16)color += letters.substr(Itemp,1);}return color;
}
@Extend(Button) function CustomText(iW:number,iH:number,iZ:number) {.fontColor(Color.White).fontSize(18).margin(5).padding(5).height(iH).width(iW).backgroundColor(getRandomColor()).align(Alignment.Start).border({width:1,color:getRandomColor()}).zIndex(iZ)
}
@Entry
@Component
struct Index {@State zIndexValue:number[]=[1,2,3,4,5,6]build() {Stack({alignContent:Alignment.Bottom}){Button('1').CustomText(300,50,this.zIndexValue[0]).onClick(()=>{this.zIndexValue[0]=-this.zIndexValue[0]})Button('2').CustomText(250,100,this.zIndexValue[1]).onClick(()=>{this.zIndexValue[1]=-this.zIndexValue[1]})Button('3').CustomText(200,200,this.zIndexValue[2]).onClick(()=>{this.zIndexValue[2]=-this.zIndexValue[2]})Button('4').CustomText(150,300,this.zIndexValue[3]).onClick(()=>{this.zIndexValue[3]=-this.zIndexValue[3]})Button('5').CustomText(100,400,this.zIndexValue[4]).onClick(()=>{this.zIndexValue[4]=-this.zIndexValue[4]})Button('6').CustomText(50,500,this.zIndexValue[5]).onClick(()=>{this.zIndexValue[5]=-this.zIndexValue[5]})}.height('100%').width('100%').backgroundColor(Color.Pink)}
}
效果图:

点击按钮可以更改按钮的叠放次序。
四、Grid(层叠布局组件)
Grid组件用于控制网格的布局和样式。
常用的属性:
① columnsTemplate:设置网格布局的列数及每列的宽度比例。例如,'1fr 1fr 1fr'表示将容器分为三列,每列占据相同的宽度。
② rowsTemplate:设置网格布局的行数及每行的高度比例。例如,'1fr 1fr'表示将容器分为两行,每行占据相同的高度。
③ columnsGap:设置列与列之间的间距。
④ rowsGap:设置行与行之间的间距。
⑤ width:设置Grid组件的宽度。
⑥ height:设置Grid组件的高度。
⑦ backgroundColor:设置Grid组件的背景颜色。
⑧ scroller:可滚动组件的控制器,用于与可滚动组件进行绑定(可选)。
GridItem是Grid的子组件,用于在网格中定义具体的项目(即单元格的内容)。GridItem组件支持多种属性,用于控制项目的布局和样式。
常用属性:
① rowStart、rowEnd:指定当前GridItem元素的起始行号和终点行号。
② columnStart、columnEnd:指定当前GridItem元素的起始列号和终点列号。
测试代码:
function getRandomColor() {const letters :string= '0123456789ABCDEF';let color:string = '#';for (let i = 0; i < 6; i++) {let Itemp:number=Math.floor(Math.random() * 16)color += letters.substr(Itemp,1);}return color;
}
@Entry
@Component
struct Index {@State numbers: string[] = ['1', '2', '3', '4','5','6'];build() {Column() {Grid() {ForEach(this.numbers, (item: string, index: number) => {GridItem() {Text(item).fontSize(16).backgroundColor(getRandomColor()).width('50%').height('50%').textAlign(TextAlign.Center).padding(20).margin(20)}.backgroundColor(getRandomColor())})}.columnsTemplate('1fr 1fr').rowsTemplate('1fr 1fr 1fr')}}
}
效果图:

实际在使用布局组件中,常常多种容器组件结合起来使用。
相关文章:
鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)
在鸿蒙ArkTS中,布局容器组件有很多,常见的有: ⑴ Column:(垂直布局容器):用于将子组件垂直排列。 ⑵ Row:(水平布局容器):用于将子组件水…...
显存占用 显存测试
目录 显存测试 显存占用示例 一个模型多卡占用 显存测试 import torch# 计算张量的大小(例如:每个 float 占用 4 字节) # 40GB 40 * 1024 * 1024 * 1024 字节 # 每个 float 4 字节,因此需要的 float 数量为 (40 * 1024 * 1024…...
快速入门CSS
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…...
AcWing 1073 树的中心 树形dp (详解)
这道题目非常有新意,在过去,我们通常先访问子节点去更新父节点的状态,但是这道题我们还需要从父节点去更新子节点。 我们可以想象为向上和向下两个方向,我们任取一点,先向下走,再回来更新上面的点…...
modelscope下载Qwen2.5 72B 模型方法
conda create -n modelscope python=3.10 conda activate modelscopepip install modelscope执行这个python代码: from modelscope.hub.snapshot_download import snapshot_download# 下载模型到当前路径 model_dir = snapshot_download(...
重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 整合 Elasticsearch 8.x (二)使用Repository 1. 环境准备1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤2.1 创建实体类2.2 创…...
为什么说模拟电路的难点就在开通过程和关断过程?难在什么地方?
模拟电路中开通过程和关断过程之所以困难,主要有以下几个方面的原因: 1. 瞬态响应特性复杂 - 在开通和关断瞬间,电路中的电流和电压会发生快速变化,产生复杂的瞬态响应。这些瞬态响应可能包含过冲、下冲、振铃等现象,…...
CubeIDE BUG-project‘hello‘has no explict encoding set hello
projecthellohas no explict encoding set hello 解决方法: 点击红色处注册账号后登录,删除原本文件后重新生成即可。...
在线PDF转图片网站
https://www.ilovepdf.com/download/qgxkmbzgxt6yb3s8l9f7fc3q9606hq0bfh4b33mnrf3p7tp8l0d4qy386b5dxqwjbhq7j3j4tp20m4dnb89wA9jjw25br1gtAw42l0m1sq047nvld4qqrm8kzjplkAhw9458p4wjgbmn08g49l23c1khsggdx4A7z3m9xh19mgzdlllyA6r1/52 在线excel转图片 https://www.zamzar.c…...
ps和top的区别
时间上的区别: ps是静态查看进程而top是动态持续监控进程 功能上的区别 ps只是查看进程,top还可以监视系统性能,如平均负载,cpu和内存的消耗 ps 常用格式:ps -ef (ef简洁aux详细 System V风格和BSD 风格) | grep P…...
自动驾驶上市潮中,会诞生下一个“英伟达”吗?
站上科技创新潮头的企业总是备受资本青睐。20世纪开始,从IT到互联网,IBM、英特尔、微软、苹果等各大科技巨头,你方唱罢我登场。 近几年,人工智能成为资本市场新传奇故事的孕育之地。今年10月,英伟达市值首度突破3.5万…...
CSS 计数器:深入解析与高级应用
CSS 计数器:深入解析与高级应用 CSS 计数器是前端开发中一个强大但经常被忽视的功能。它们允许开发者创建和管理自定义的计数序列,这在处理复杂文档结构时尤其有用。本文将深入探讨 CSS 计数器的原理、用法,并展示一些高级应用示例。 什么是…...
【真题笔记】15年系统架构设计师要点总结
【真题笔记】15年系统架构设计师要点总结 分布式数据库中各种透明RAID 5IPv6 IPv4电子商务系统项目配置管理IPO图(输入加工输出图)桥接模式的UML图面向对象设计原则软件测试 在15年真题练习中,对错题模棱两可的考点进行重点记录与内容延申。…...
斗破C++编程入门系列之三十九:多态性:纯虚函数和抽象类(四星斗师)
斗破C目录: 斗破C编程入门系列之前言(斗之气三段) 斗破C编程入门系列之二:Qt的使用介绍(斗之气三段) 斗破C编程入门系列之三:数据结构(斗之气三段) 斗破C编程入门系列之…...
目前美国的互联网环境
随着科技的迅猛发展,互联网已经成为了现代社会不可或缺的一部分。作为全球科技创新的领导者之一,美国在互联网领域拥有着丰富的资源和先进的技术。本文将对美国目前的互联网环境进行探讨,包括网络基础设施、网络安全、数字经济以及互联网对社…...
从最小作用量原理推导牛顿三大定律
从最小作用量原理推导牛顿三大定律 引言 在物理学中,牛顿三大定律是描述经典力学中物体运动的基本定律。然而,这些定律并不是孤立存在的,它们可以从一个更为普遍的原理——最小作用量原理中推导出来。最小作用量原理是一个深刻而优雅的理论…...
【系统集成项目管理工程师教程】第4章 信息系统架构
教程内容总结,供参考,有错误请指正,友好交流。 4.架构基础 4.1.1指导思想 4.1.2设计原则 原则内容:包括坚持以人为本、创新引领、问题导向、整体协同、安全可控、科学实施等,这些原则应基于组织的信念和价值观&…...
docker下迁移elasticsearch的问题与解决方案
欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 docker下迁移elasticsearch的问题与解决方案 数据挂载报错解决权限问题节点故障 直接上图&#x…...
占地1.1万平,2亿投资的智能仓储系统:高架库、AGV、码垛机器人……
导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 我国调味料市场近年来展现出惊人的增长潜力,各大品牌纷纷加大投入,力求在竞争中脱颖而出。 广东美味鲜调味食品有限公司,作为行业内的佼佼者&#…...
一个小程序如何对接多个收款账户?
背景 我又来了,之前对接过网约巴士系统 网约巴士旅游专线平台搭建历程,运营了两年多了。在运营中完善、在完善中学习,一直是不变的真理。有一句话说得好:先做一个垃圾、用起来再说。 今天又需要升级了,需求是&#…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
