鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)

  在鸿蒙ArkTS中,布局容器组件有很多,常见的有:
  ⑴ Column:(垂直布局容器):用于将子组件垂直排列。
  ⑵ Row:(水平布局容器):用于将子组件水平排列。
  ⑶ Flex:(弹性布局方式)它提供了更加有效的方法对容器中的子元素进行排列、对齐和分配剩余空间。
  ⑷ Stack:Stack布局是一种可以将多个组件按照一定顺序叠放的布局。
  ⑸ Grid(网格容器):用于创建二维网格布局,适合需要行列对齐的复杂布局。
  ⑹ List(列表容器):用于展示列表数据,可以设置列表项的布局和样式。
  ⑺ Tabs(页签容器):用于创建页签布局,允许用户在不同的页面或视图间切换。
  ⑻ Swiper(滑块视图容器):用于创建滑动视图,常用于图片轮播或广告等场景。
  ⑼ Scroll(可滑动的容器):允许用户滚动查看超出视图范围的内容。
  ⑽ RelativeContainer(相对布局容器):允许子元素相对于容器或指定的兄弟元素进行定位。
  上面的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')}}
}

  效果图:


  实际在使用布局组件中,常常多种容器组件结合起来使用。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/6713.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【点击劫持漏洞(附测试代码)】

漏洞描述 点击劫持&#xff08;Clickjacking&#xff09;是一种网络攻击技术&#xff0c;攻击者通过将一个恶意的页面或按钮隐藏在合法网站的页面下&#xff0c;诱使用户在不知情的情况下点击隐藏的内容&#xff0c;从而触发攻击者设计的操作。这种攻击通常会导致用户无意中执…

大数据新视界 -- 大数据大厂之经典案例解析:电商企业如何靠 Impala性能优化逆袭(上)(9/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

语音 AI 迎来爆发期,也仍然隐藏着被低估的机会丨RTE2024 音频技术和 Voice AI 专场

在人工智能快速发展的今天&#xff0c;语音交互技术正经历一场革命性的变革。从语音识别到语音合成&#xff0c;再到端到端的语音对话系统&#xff0c;这一领域的创新正以前所未有的速度推进。这些进步不仅提升了技术指标&#xff0c;更为实时翻译、虚拟数字人、智能客服等实时…

vue3 + ts + element-plus 二次封装 el-table

一、实现效果&#xff1a; &#xff08;1&#xff09;数据为空时&#xff1a; &#xff08;2&#xff09;有数据时&#xff1a;存在数据合并&#xff1b;可自定义表头和列的内容 &#xff08;3&#xff09;新增行&#xff1a; &#xff08;4&#xff09;删除行&#xff1a; &a…

6 张图带你深入了解 kube-scheduler

本文目录&#xff1a; kube-scheduler 用途Scheduler Pod 调度流程源码调用链路Scheduler Framework如何扩展 kube-scheduler 用途 顾名思义&#xff1a;负责将 Pod 调度到 Node 上。 Pod 创建流程&#xff1a; 说明&#xff1a; 所有的组件只与 Apiserver 做交互&#xff0…

数据结构(8.7_1)——外部排序

知识总览 外存、内存之间的数据交换 外部排序原理 构造初始“归并段” 第一趟归并 第二趟归并 输出缓冲区1空了用归并段1的下一块元素补上 ..... 顺序的两个归并段方法一样..... 第三趟归并 时间开销分析 对外部排序进行优化 由于文件总块数无法改变&#xff0c;所以…

“方块兽神仙猿点石成金”游戏搭建开发

“方块兽神仙猿点石成金”是一款结合了策略和运气的休闲游戏。玩家需在规定时间内向不同的山头投入矿石&#xff0c;等待神仙猿降临并随机选择一座山进行“点石成金”。根据神仙猿的选择&#xff0c;玩家将获得不同的奖励。 游戏核心机制 矿石投入&#xff1a;玩家在游戏开始…

【压力测试】如何确定系统最大并发用户数?

一、明确测试目的与了解需求 明确测试目的&#xff1a;首先需要明确测试的目的&#xff0c;即为什么要确定系统的最大并发用户数。这通常与业务需求、系统预期的最大用户负载以及系统的稳定性要求相关。 了解业务需求&#xff1a;深入了解系统的业务特性&#xff0c;包括用户行…

达梦数据库DM管理工具增删改不生效怎么办?如何设置事务自动提交?

前言 我在使用达梦数据库DM时&#xff0c;一开始使用的是达梦数据库自带的连接工具DM管理工具。自带的有它自己的好处&#xff0c;起码对于修改新增字段等是比较兼容的。后面我发现DBeaver也是支持连接达梦数据库的&#xff0c;所以后面用DBeaver也在连接达梦数据库。 我在一…

JVM出现OOM错误排查

前言 对应线程出现的OOM错误&#xff0c;其实分好几类&#xff1a;堆内存溢出、栈溢出、方法区溢出&#xff0c;下面我们要区分两个概念 内存泄漏&#xff1a; 内存泄漏是指GC垃圾回收的速度跟不上内存消耗的速度,造成OOM的情况 内存溢出: 内存溢出是指程序员在申请内存时&…

WinForms 中使用 MVVM 模式构建应用:实现登录页面、页面导航及 SQLite 数据库连接完整框架搭建过程

前言 在传统的 WinForms 应用程序开发中&#xff0c;很多开发者使用事件驱动的设计模式&#xff0c;直接将业务逻辑编写在界面代码中。然而&#xff0c;随着应用程序的复杂性增加&#xff0c;单一的界面文件变得臃肿&#xff0c;难以测试和维护。借鉴 WPF 中 MVVM&#xff08;…

windows系统编程 - 静态库和动态库

文章目录 前言一、使用obj保护源码生成obj文件导入并使用obj文件方式一 拖入解决方案方式二 附加依赖项适配C语言文件 二、静态库的概述三、静态库的创建与使用四、动态库的概述五、动态库的创建六、动态库的两种调用方式七、动态链接库的隐式加载__declspec(dllimport) 声明外…

数据结构 ——— 查找链式二叉树中值为X的节点

目录 链式二叉树示意图 手搓一个链式二叉树 查找链式二叉树中值为X的节点 链式二叉树示意图 手搓一个链式二叉树 代码演示&#xff1a; // 数据类型 typedef int BTDataType;// 二叉树节点的结构 typedef struct BinaryTreeNode {BTDataType data; //每个节点的数据struc…

基于SSM的BBS社区论坛系统源码

1.项目介绍 系统角色&#xff1a;管理员、业主&#xff08;普通用户&#xff09;功能模块&#xff1a;管理员&#xff08;用户管理、二手置换管理、报修管理、缴费管理、公告管理&#xff09;、普通用户&#xff08;登录注册、二手置换、生活缴费、信息采集、报事报修&#xf…

python的安装环境Miniconda(Conda 命令管理依赖配置)

这一段时间&#xff0c;对AI大模型 有了兴趣就想研究一下。 在研究之前肯定要先把需要的编程技能掌握了。经过我查阅资料&#xff0c;今天就先学一下 python的 环境安装。 Node.js 包管理工具&#xff1a;npm 依赖配置文件&#xff1a;package.json 环境管理&#xff1a;nvm&am…

出租房管理系统有哪些?

出租房管理系统在现代房产租赁市场中发挥着至关重要的作用&#xff0c;其供应商众多&#xff0c;各具特色。以下是对易收租、寓小二、全房通、水滴管家以及悟空租房管理系统等供应商的详细介绍。 一、深圳合众致达科技有限公司的易收租 深圳合众致达科技有限公司是一家专注于…

【在Linux世界中追寻伟大的One Piece】Socket编程TCP

目录 1 -> TCP socket API 2 -> V1 -Echo Server 2.1 -> 测试多个连接的情况 1 -> TCP socket API socket()&#xff1a; socket()打开一个网络通讯端口&#xff0c;如果成功的话&#xff0c;就像open()一样返回一个文件描述符。应用程序可以像读写文件一样用r…

【spring】IOC与DI

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;程序猿的春天 一、IOC&#xff08;Inversion of Control&#xff09; 1、概念 IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是一种设计原则&#xff0c;它将对象的控制权…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-16

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

​​​​​​​PHP类型比较

在php中符号分为两种&#xff0c;一种是&#xff0c;还是一种是 松散比较&#xff1a;使用两个等号 比较&#xff0c;只比较值&#xff0c;不比较类型。 严格比较&#xff1a;用三个等号 比较&#xff0c;除了比较值&#xff0c;也比较类型。 注意&#xff0c;当一个号时&…