鸿蒙应用开发ArkTS容器组件的使用

语雀知识库地址:语雀HarmonyOS知识库
飞书知识库地址:飞书HarmonyOS知识库


本文示例代码地址:Gitee 仓库地址

嗨,大家好,我是小白

上篇文章向大家介绍了 ArkTS 中我们经常使用到的几种基础组件,Text、Button 等。但是这些基础组件并不能完全满足一个 APP 的布局管理

就好比我们在使用 APP 时,常常看到的商品列表、登陆界面、悬浮按钮等等,都是通过一系列的布局方式来呈现的

比如我们在使用购物软件查询商品时,展示出来的是一个列表布局;等应用的登录界面,用户名与输入框、用户名行与密码行属于一个不同方向的线性布局;又比如表格中的每一列宽度均匀分布,这又属于弹性布局

举一个栗子,假设我们要一个登录界面,该界面有用户名、密码及输入框,当我们不加任何容器的情况下,呈现出来的是下面这种效果

image.png

这样子我们的页面虽然有了元素,但是在整体布局上不是很合理,按理来说输入框应该是与文本同行展示,而现在缺是换行展示

这是因为当前没有给向同行的组件添加布局方式而导致的这种效果
这篇文章就来探讨一下常用的布局方式

线性布局——Column/Row

线性布局是应用中最常用的布局,通过线性容器 RowColumn 构建

线性布局是其他布局的基础,其子元素在水平方向和垂直方向依次排列

线性布局的排列方向由所选容器组件决定,Column 容器内子元素按照垂直方向排列,Row 容器内子元素按照水平方向排列。根据不同的排列方向,可选择使用 Row 或 Column 容器创建线性布局

image.png

基本概念
  • 布局容器:具有布局能力的容器组件,可以承载其他元素作为其子元素,布局容器会对其子元素进行尺寸计算和布局排列
  • 布局子元素:布局容器内部的元素
  • 主轴:线性布局容器在布局方向上的轴线,子元素默认沿主轴排列。Row容器主轴为横向,Column容器主轴为纵向
  • 交叉轴:垂直于主轴方向的轴线。Row容器交叉轴为纵向,Column容器交叉轴为横向
  • 间距:布局子元素的间距
定义方式
Column(value?: {space?: string | number})
Row(value?:{space?: number | string })
参数解读
  • space:横向或者竖向元素间距
Column({ space: 10 })
Row({ space: 10 })
设置属性
Column({ space: 10 })
  .justifyContent(FlexAlign.Center)
  .alignItems(HorizontalAlign.Center)
Row({ space: 10 })
  .alignItems(VerticalAlign.Center)
  .justifyContent(FlexAlign.Center)
  • alignItems
    • Column 设置子组件在水平方向上的对齐格式
    • Row 设置子组件在垂直方向上的对齐格式
  • justifyContent
    • Column 设置子组件在垂直方向上的对齐格式
    • Row 设置子组件在水平方向上的对齐格式
子元素在交叉轴上的对齐方式

交叉轴为垂直方向时,取值为VerticalAlign类型,水平方向取值为HorizontalAlign

alignSelf 属性用于控制单个子元素在容器交叉轴上的对齐方式,其优先级高于 alignItems 属性,如果设置了 alignSelf 属性,则在单个子元素上会覆盖 alignItems 属性

  • Column
    • HorizontalAlign.Start:子元素在水平方向左对齐
    • HorizontalAlign.Center:子元素在水平方向居中对齐
    • HorizontalAlign.End:子元素在水平方向右对齐
  • Row
    • VerticalAlign.Top:子元素在垂直方向顶部对齐
    • VerticalAlign.Center:子元素在垂直方向居中对齐
    • VerticalAlign.Bottom:子元素在垂直方向底部对齐
子元素在主轴上的排列方式
  • Column
    • justifyContent(FlexAlign.Start):元素在垂直方向首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐
    • justifyContent(FlexAlign.Center):元素在垂直方向中心对齐,第一个元素与行首的距离与最后一个元素与行尾距离相同
    • justifyContent(FlexAlign.End):元素在垂直方向尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐
    • justifyContent(FlexAlign.Spacebetween):垂直方向均匀分配元素,相邻元素之间距离相同。第一个元素与行首对齐,最后一个元素与行尾对齐
    • justifyContent(FlexAlign.SpaceAround):垂直方向均匀分配元素,相邻元素之间距离相同。第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半
    • justifyContent(FlexAlign.SpaceEvenly):垂直方向均匀分配元素,相邻元素之间的距离、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样
  • Row
    • justifyContent(FlexAlign.Start):元素在水平方向方向首端对齐,第一个元素与行首对齐,同时后续的元素与前一个对齐
    • justifyContent(FlexAlign.Center):元素在水平方向方向中心对齐,第一个元素与行首的距离与最后一个元素与行尾距离相同
    • justifyContent(FlexAlign.End):元素在水平方向方向尾部对齐,最后一个元素与行尾对齐,其他元素与后一个对齐
    • justifyContent(FlexAlign.Spacebetween):水平方向方向均匀分配元素,相邻元素之间距离相同。第一个元素与行首对齐,最后一个元素与行尾对齐
    • justifyContent(FlexAlign.SpaceAround):水平方向方向均匀分配元素,相邻元素之间距离相同。第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半
    • justifyContent(FlexAlign.SpaceEvenly):水平方向方向均匀分配元素,相邻元素之间的距离、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样
自适应拉伸

在线性布局下,常用空白填充组件Blank,在容器主轴方向自动填充空白空间,达到自适应拉伸效果

Row和Column作为容器,只需要添加宽高为百分比,当屏幕宽高发生变化时,会产生自适应效果

自适应缩放

自适应缩放是指子组件随容器尺寸的变化而按照预设的比例自动调整尺寸,适应各种不同大小的设备。在线性布局中,可以使用以下两种方法实现自适应缩放。

  • 父容器尺寸确定时,使用 layoutWeight 属性设置子组件和兄弟元素在主轴上的权重,忽略元素本身尺寸设置,使它们在任意尺寸的设备下自适应占满剩余空间
  • 父容器尺寸确定时,使用百分比设置子组件和兄弟元素的宽度,使他们在任意尺寸的设备下保持固定的自适应占比
自适应延伸

自适应延伸是指在不同尺寸设备下,当页面的内容超出屏幕大小而无法完全显示时,可以通过滚动条进行拖动展示。这种方法适用于线性布局中内容无法一屏展示的场景。通常有以下两种实现方式

  • 在List中添加滚动条:当 List 子项过多一屏放不下时,可以将每一项子元素放置在不同的组件中,通过滚动条进行拖动展示。可以通过 scrollBar 属性设置滚动条的常驻状态,edgeEffect 属性设置拖动到内容最末端的回弹效果
  • 使用Scroll组件:在线性布局中,可以进行竖向或者横向的布局。当一屏无法完全显示时,可以在Column或Row组件的外层包裹一个可滚动的容器组件Scroll来实现可滑动的线性布局

列表——List

基本概念

列表是一种复杂的容器,当列表项达到一定数量,内容超过屏幕大小时,可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集,例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求(如通讯录、音乐列表、购物清单等)

使用列表可以轻松高效地显示结构化、可滚动的信息。通过在 List 组件中按垂直或者水平方向线性排列子组件 ListItemGroup 或 ListItem ,为列表中的行或列提供单个视图,或使用 ForEach 迭代一组行或列,或混合任意数量的单个视图和 ForEach 结构,构建一个列表。List 组件支持使用条件渲染、循环渲染、懒加载等渲染控制方式生成子组件

定义方式
List(value?: {space?: number | string, initialIndex?: number, scroller?: Scroller})
参数解读
List({ space: 20, initialIndex: 0 })
  • space:子组件主轴方向的间隔
  • initialIndex:设置当前List初次加载时视口起始位置显示的item的索引值
  • scroller:可滚动组件的控制器,用于与可滚动组件进行绑定
设置属性
List({ space: 20, initialIndex: 0 }) {
  ForEach(this.arr, (item) => {
    ListItem() {
      Text('' + item)
        .width('100%')
        .height(100)
        .fontSize(16)
        .textAlign(TextAlign.Center)
        .borderRadius(10)
        .backgroundColor(0xFFFFFF)
      }
    }, item => item)
  }
  .listDirection(Axis.Vertical) // 排列方向
  .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线
  .edgeEffect(EdgeEffect.Spring) // 滑动到边缘无效果
  .onScrollIndex((firstIndex: number, lastIndex: number) => {
    console.info('first' + firstIndex)
    console.info('last' + lastIndex)
  })
  .width('90%')
  .height('100%')
}

image.png
其中:

  • listDirection:设置List组件排列方向
  • divider:设置ListItem分割线样式,默认无分割线
    • strokeWidth: 分割线的线宽
    • color: 分割线的颜色
    • startMargin: 分割线与列表侧边起始端的距离
    • endMargin: 分割线与列表侧边结束端的距离
  • edgeEffect:设置组件的滑动效果
  • scrollBar:设置滚动条状态
设置事件

List 组件的相关事件参考官方文档

弹性布局——Flex

基本概念

弹性布局提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间

容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为交叉轴尺寸

弹性布局在开发场景中用例特别多,比如页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等等

定义方式
Flex(value?: { direction?: FlexDirection, wrap?: FlexWrap, justifyContent?: FlexAlign, alignItems?: ItemAlign, alignContent?: FlexAlign })
参数解读
Flex({
  direction: FlexDirection.Row,
  wrap: FlexWrap.NoWrap,
  justifyContent: FlexAlign.Center,
  alignItems: ItemAlign.Center,
  alignContent: FlexAlign.Center
})
  • direction:子组件在Flex容器上排列的方向,即主轴的方向
  • wrap:Flex容器是单行/列还是多行/列排列
  • justifyContent:所有子组件在Flex容器主轴上的对齐格式
  • alignItems:所有子组件在Flex容器交叉轴上的对齐格式
  • alignContent:交叉轴中有额外的空间时,多行内容的对齐方式。仅在wrap为Wrap或WrapReverse下生效
交叉轴对齐方式
容器组件的交叉轴对齐方式

通过Flex组件的alignItems参数设置子组件在交叉轴的对齐方式

  • ItemAlign.Auto:使用Flex容器中默认配置
  • ItemAlign.Start:交叉轴方向首部对齐
  • ItemAlign.Center:交叉轴方向居中对齐
  • ItemAlign.End:交叉轴方向底部对齐
  • ItemAlign.Stretch:交叉轴方向拉伸填充,在未设置尺寸时,拉伸到容器尺寸
  • ItemAlign. Baseline:交叉轴方向文本基线对齐
子组件设置交叉轴对齐

子组件的 alignSelf 属性也可以设置子组件在父容器交叉轴的对齐格式,且会覆盖 Flex 布局容器中 alignItems 配置

自适应拉伸

在弹性布局父组件尺寸不够大的时候,通过子组件的下面几个属性设置其在父容器的占比,达到自适应布局能力

  • flexBasis:设置子组件在父容器主轴方向上的基准尺寸。如果设置了该值,则子项占用的空间为设置的值;如果没设置该属性,那子项的空间为 width / height 的值
  • flexGrow:设置父容器的剩余空间分配给此属性所在组件的比例。用于“瓜分”父组件的剩余空间
  • flexShrink: 当父容器空间不足时,子组件的压缩比例

层叠布局——Stack

基本概念

层叠布局用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠,容器中的子组件依次入栈,后一个子元素覆盖前一个子元素,子元素可以叠加,也可以设置位置

层叠布局具有较强的页面层叠、位置定位能力,其使用场景有广告、卡片层叠效果等
image.png

定义方式
Stack(value?: { alignContent?: Alignment })
参数解读
Stack({ alignContent: Alignment.Center })
  • alignContent:设置子组件在容器内的对齐方式
设置属性
Stack({ alignContent: Alignment.Center })
        .alignContent(Alignment.Center)
  • alignContent:设置所有子组件在容器内的对齐方式
Z 序控制

Stack容器中兄弟组件显示层级关系可以通过 Z序控制的 zIndex 属性改变。zIndex 值越大,显示层级越高,即 zIndex 值大的组件会覆盖在 zIndex 值小的组件上方

Stack({ alignContent: Alignment.BottomStart }) {
  Column() {
    Text('Stack子元素1').fontSize(15)
  }.width(50).height(50).backgroundColor(0xffd306).zIndex(2)

  Column() {
    Text('Stack子元素2').fontSize(12)
  }.width(75).height(75).backgroundColor(Color.Pink).zIndex(1)

  Column() {
    Text('Stack子元素3').fontSize(15)
  }.width(100).height(100).backgroundColor(Color.Grey)
}.margin({ top: 10 }).width(125).height(125).backgroundColor(0xe0e0e0)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于教与学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.教与学算法4.实验参数设定5.算法结果6.参考文…

【Python必做100题】之第三题(找出100以内的奇数并打印)

思路: 1、定义一个空列表来存储所有的奇数 2、判断是奇数就追加到列表的末尾 3、打印所有的奇数 代码如下: list [ ] #定义一个列表来存储所有的奇数 for i in range (1,100):if i % 2 ! 0: #判断是否为奇数list.append(i) #追加到列表的末尾 prin…

仿照MyBatis手写一个持久层框架学习

首先数据准备,创建MySQL数据库mybatis,创建表并插入数据。 DROP TABLE IF EXISTS user_t; CREATE TABLE user_t ( id INT PRIMARY KEY, username VARCHAR ( 128 ) ); INSERT INTO user_t VALUES(1,Tom); INSERT INTO user_t VALUES(2,Jerry);JDBC API允…

《信息技术时代》期刊杂志论文发表投稿

《信息技术时代》期刊收稿方向:通信工程、大数据、计算机、办公自动化、信息或计算机教育、电子技术、系统设计、移动信息、图情信息研究、人工智能、智能技术、信息技术与网络安全等。 刊名:信息技术时代 主管主办单位:深圳湾科技发展有限…

【sgAutocomplete】自定义组件:基于elementUI的el-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

API接口并发测试:如何测试API接口的最大并发能力?

本文将深入探讨API接口并发测试&#xff0c;介绍并比较不同的API并发测试工具&#xff0c;并分享如何有效测量和提高API接口在最大并发情况下的性能。了解如何应对高并发压力是保证系统稳定性和用户满意度的关键&#xff0c;让我们一起来探索这个重要的话题。 随着互联网的迅速…

selenium库的使用

来都来了给我点个赞收藏一下再走呗&#x1f339;&#x1f339;&#x1f339;&#x1f339;&#x1f339; 目录 一、下载需要用到的python库selenium 二、selenium的基本使用 1.在python代码引入库 2.打开浏览器 3.元素定位 1&#xff09;通过id定位 2&#xff09;通过标…

计算机组成原理-指令寻址

指令寻址 指令 寻址下一条欲执行指令的地址&#xff08;始终由程序计数器PC给出) 顺序寻址 &#xff08;PC&#xff09;“1”-> PC 这里的1理解为1个指令字长&#xff0c;实际加的值会因指令长度、编址方式而不同 **跳跃寻址 **由转移指令指出 数据寻址 确定 本条指令 的…

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Android12】Android Framework系列--AMS启动Activity分析

AMS启动Activity分析 通过ActivityManagerService(AMS)提供的方法&#xff0c;可以启动指定的Activity。比如Launcher中点击应用图标后&#xff0c;调用AMS的startActivity函数启动应用。 AMS提供的服务通过IActivityManager.aidl文件定义。 // frameworks/base/core/java/an…

智能优化算法应用:基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.郊狼算法4.实验参数设定5.算法结果6.参考文献7.MA…

关于IDEA中maven的作用以及如何配置MAVEN

关于IDEA中maven的作用以及如何配置MAVEN 1、Maven是什么2、Idea中对于Maven的配置3、下载依赖时&#xff0c;Idea下方的显示3.1、Maven中央仓库的下载显示界面3.2、阿里云仓库的下载显示界面 4、Maven在Idea中的使用4.1、clean4.2、validate4.3、compile4.4、test&#xff08;…

pyqt5使用Designer实现按钮上传图片

pyqt5使用Designer实现按钮上传图片 1、ui界面 2、ui转py代码 其中uploadimg.py代码如下&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file uploadimg.ui # # Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manua…

git 使用记录

远程仓库为空初始化 初始化本地仓库 git init 在本地仓库书写代码&#xff08;这里可以编辑一个文本文件做测试&#xff0c;如hello.txt&#xff09; 5&#xff09;执行&#xff1a;git add 要让git管理的文件&#xff08;git add hello.txt&#xff09;>执行完此操作将我…

有趣的数学 用示例来阐述什么是初值问题一

一、初值问题简述 在多变量微积分中&#xff0c;初值问题是一个常微分方程以及一个初始条件&#xff0c;该初始条件指定域中给定点处未知函数的值。在物理学或其他科学中对系统进行建模通常相当于解决初始值问题。 通常给定的微分方程有无数个解&#xff0c;因此我们很自然地会…

Linux 基础IO

文章目录 前言基础IO定义系统IO接口文件描述符重定向原理缓冲区刷新 前言 要知道每个函数/接口的全部参数和返回值建议去官网或者直接在Linux的man手册中查&#xff0c;这不是复制粘贴函数用法的文章。 C语言文件读写介绍链接 基础IO定义 IO是Input/Output的缩写&#xff0c…

【大数据】Hudi 核心知识点详解(一)

&#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; 吧 &#xff08;点赞 &#x1f9e1;、关注 &#x1f49b;、收藏 &#x1f49a;&#xff09;&#xff01;&#xff01;&#xff01;您的支持 &#x…

【操作宝典】VSCode解锁指南:释放潜能的详细教程!

目录 &#x1f4d6;前言 &#x1f680; 1 配置node.js &#x1f680;2. 使用脚本测试vue项目 &#x1f680;3. VSCode运行vue &#x1f680;4. VSCode引入elementUI &#x1f31f;4.1 显示OPENSSL错误 &#x1f4d6;前言 Visual Studio Code&#xff08;简称VSCode&#x…

MySQL数据库,创建和管理表

创建数据库&#xff1a; 方式一&#xff1a;创建数据库 CREATE DATABASE 数据库名&#xff1b;&#xff08;使用的是默认的字符集&#xff09; 方式二&#xff1a;创建数据库并指定字符集 CREATE DATABASE 数据库名 CHARACTER SET 字符集&#xff1b; 方式三&#xff1a;判断数…

基于若依的ruoyi-nbcio的flowable流程管理系统增加服务任务和我的抄送功能

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 1、增加一个状态字段 wf_copy增加下面两个字段 就用未读已读来区分 2、前端 api接口增加如下&#xff…