当前位置: 首页 > article >正文

HarmonyOS-ArkUI Grip组件

我们在学习List的时候,已经捎带引入了Grid。讲解如下图所示:

也就是,如果一个表,长宽基本都是一致的,那么此时可以完全不用Grid也可以实现,并且,优先考虑的就是List。

如果List实现不了的情况下,我们才会考虑到要不要用Grid来完成。那么grid究竟存在什么List不具备的能力呢?

我们首先看一张图就大致明白了。 Grid组件可以实现的能力:

其中中间的那张布局结构,就是Grid与List相比有明显差异的地方。当我们有需求,要求每一个子组件并非是严格的相等的宽高时,采用Grid组件是比较合适的。

好有了大概得了解 ,我们接下来来学习一下,这个组件,并掌握这么错落有致的界面应该怎么搭建,搭建的时候,组件的其他属性限制。

概述

网格布局是由“行”和“列”分割的单元格组成,通过指定项目所在的单元格做出各种各样的布局,网格布局具有较强的页面均分能力,子组件占比控制能力,是一种重要的自适应布局,使用场景如,九宫格,计算器,日历等。

ArkUI为网格布局提供了相关的组件,Grid以及GridItem。Grid用来设置布局相关参数,GridItem定义子组件相关特征。Grid组件也支持,条件渲染,循环渲染,和懒加载等方式来生成组件.

Grid与GridItem组件的关系:

Grid组件支持自定义行数和每行每列尺寸占比,设置子组件可以横跨几行和几列,同时提供了水平和垂直的布局能力。当网格容器组件发生变化时,所有组件以及间距会等比例调整,从而实现布局的自适应能力。根据Grid的这些布局能力,可以构建出不同的网格样式。

设置排列方式

Grid的亮点就是用户可以设置排列方式,下面我们学习一下应该怎么排列。

设置行列数量与占比

首先看看效果图

Grid提供了rowsTemplatecolumnsTemplate属性,用来设置网格布局的行数,行占比,列数,列占比。他们的值的格式是一个数组,数组的数量即可表示行或者列的数量,数组的内容则代表占比。

上图,构建的是一个三行三列的网格,其中每一行的第二列都是第一行的2倍宽度。所以我们可以这样写。

@Entry
@Component
struct GridItemPage {@State numberList: string[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8']build() {Stack() {Grid() {ForEach(this.numberList, (item:string)=>{GridItem(){Text(item).backgroundColor(Color.Pink)}.backgroundColor(Color.Brown)}, (item:string)=> item.toString())}// 注意中间一定不要有逗号,有逗号,渲染就会出问题。就是空格分开的.// 另外,展示的数量就是这个行列相乘的数量.即使给定的数据很多,也就会展示这几个元素,且没有滚动交互..rowsTemplate('1fr 1fr 1fr').columnsTemplate('1fr 2fr 1fr').rowsGap(10).columnsGap(10)}}
}

注意:

当Grid设置了rowsTemplate和columnsTemplate之后,相当于Grid的方向大小已经确定了,所以以下几个不奏效

  • layoutDirection
  • maxCount
  • minCount
  • cellLengh

另外,因为设置了rowsTemplate和columnsTemplate之后,相当于展示的总量已经固定死了,所以Grid的滚动效果也不会被触发,上述界面是不可以滚动的。

构建可滚动的网格布局

可滚动的网格布局,在首页或者某一个重要的Tab页中用到的是比较多的。这个实现也会用到我们上文讲的 rowsTemplete或者 columnsTemplete,但是使用的时候有个特殊的就是,只用其中一个,系统会因为没有另外一个而造成开放式的这种情形,当内容超出了所能显示的,就会有滚动效果了。

  • 仅仅设置columnsTemplete: 那么就代表列是固定死了, 只能在行上进行发挥,所以滚动是上下滚动,行数随着内容有多少,就会有相应的几行。
  • 仅仅设置rowsTemplete: 那么就代表行已经被固定死了,只能在列进行发挥,所以滚动的时候是左右滚动,列数随着内容有多少,就会有相应的多少列。
@Entry
@Component
struct GridItemPage {@State numberList: string[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8']build() {Stack() {Grid() {ForEach(this.numberList, (item:string)=>{GridItem(){Text(item).backgroundColor(Color.Pink)}.width(100).height(100).backgroundColor(Color.Brown)}, (item:string)=> item.toString())}// 注意中间一定不要有逗号,就是空格分开的.// 另外,展示的数量就是这个行列相乘的数量.即使给定的数据很多,也就会展示这几个元素,且没有滚动交互..rowsTemplate('1fr 1fr')// .columnsTemplate('1fr 2fr 1fr').rowsGap(10).columnsGap(10).width('100%').height('auto')}.width('100%').height(200)}
}

可以观察下此时的排布,是纵向排布的!我们在写代码的时候注意下排布方向。

不均匀网格布局

我们可以通过创建Grid组件时传入GridLayoutOptions实现上图所示的,单个网格横跨多行多列的场景,设置方式如下:

layoutOptions: GridLayoutOptions = {regularSize: [1, 1],onGetRectByIndex: (index: number) => {if (index == key1) { // key1是“0”按键对应的indexreturn [6, 0, 1, 2]; // [rowStart,columnStart,rowSpan,columnSpan] 格式} else if (index == key2) { // key2是“=”按键对应的indexreturn [5, 3, 2, 1];}// ...// 这里需要根据具体布局返回其他item的位置}
}Grid(undefined, this.layoutOptions) {// ...
}
.columnsTemplate('1fr 1fr 1fr 1fr')
.rowsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr')

[rowStart,columnStart,rowSpan,columnSpan] 格式讲解

  • rowStart 当前元素起始行号
  • columStart 当前元素其实列号
  • rowSpan 当前元素占用的行数
  • columSpan 当前元素占用的列数

如果一个onGetRectByIndex回调,返回的结果是 [6, 0, 1, 2 ]也就是告知,在布局第6排第0列的数据时,它要站一行,两列的大小。

就像下方的计算器,0 的位置,就可以这么描述。

设置主轴方向

如果不做了解的话,我们可能会有一个疑惑。就是网格布局的主轴方向,有必要么?它会影响什么呢? 答案是影响排布顺序。如图所示。

Grid设置主轴方向的属性是layoutDirection, 同时要搭配 maxCountminCount来使用

  • layoutDirection 设置主轴方向。
  • maxCount: 主轴方向最大可以排几个格。
  • minCount: 主轴方向最小可以排几个格。
Grid() {// ...
}
.maxCount(3)
.layoutDirection(GridDirection.Row)

说明

  • layoutDirection属性仅在不设置rowsTemplate和columnsTemplate时生效,此时元素在layoutDirection方向上排列。
  • 仅设置rowsTemplate时,Grid主轴为水平方向,交叉轴为垂直方向。
  • 仅设置columnsTemplate时,Grid主轴为垂直方向,交叉轴为水平方向。

上文可见,Grid在这种情况下,子组件的数量可能是变动的,所以约束了行或者列的铺排形式。相当于开放式布局。所以我们在约束的时候最好给一个最大可以排几个格子这种值。

设置行列间距

这个很简单,就是columnsGap列间距, rowsGap行间距。

Grid() {// ...
}
.columnsGap(10)
.rowsGap(15)

控制滚动位置

与新闻列表返回到顶部比较相似,滚动位置功能在网格布局中也比较常用,比如日历中的翻页功能。

实现方式,我们记住,凡是滚动控制,都离不开滚动控制器。我们在用系统组件的时候,但凡碰到滚动控制的时候都应该向这个方向来考虑。只是具体的控制器类型有区别,控制的内容细节有区别。套路是大差不差的。在这个案例中我们也是,在Grid构建的时候就会传入一个Scroller。这个跟List是一样的。

@Entry
@Component
struct GridItemPage {private gridScroller:Scroller = new Scroller()@State numberList: string[] = ['0', '1', '2', '3', '4', '5', '6', '7', '8']build() {Column(){Grid(this.gridScroller) {ForEach(this.numberList, (item:string)=>{GridItem(){Text(item).backgroundColor(Color.Pink)}.width(100).height(100).backgroundColor(Color.Brown)}, (item:string)=> item.toString())}// 注意中间一定不要有逗号,就是空格分开的.// 另外,展示的数量就是这个行列相乘的数量.即使给定的数据很多,也就会展示这几个元素,且没有滚动交互..rowsTemplate('1fr 1fr')// .columnsTemplate('1fr 2fr 1fr').rowsGap(10).columnsGap(10).width('100%').height('30%')Row(){Button("上一页").width(100).height('wrap').onClick(()=>{this.gridScroller.scrollPage({next: false})})Button("下一页").width(100).height('wrap').onClick(()=>{this.gridScroller.scrollPage({next: true})})}.width('100%').justifyContent(FlexAlign.SpaceEvenly).margin({top: 20})}}
}

Grid性能优化-懒加载

这个也就是和List的优化方式如出一辙,就是设置懒加载,然后设置加载数量。

Grid() {LazyForEach(this.dataSource, () => {GridItem() {}})
}
.cachedCount(3)

属性互斥关系及注意事项总结

相关文章:

HarmonyOS-ArkUI Grip组件

我们在学习List的时候,已经捎带引入了Grid。讲解如下图所示: 也就是,如果一个表,长宽基本都是一致的,那么此时可以完全不用Grid也可以实现,并且,优先考虑的就是List。 如果List实现不了的情况下…...

2025清华大学:DeepSeek教程全集(PDF+视频精讲,共10份).zip

一、资料列表 第一课:Deepseek基础入门 第二课:DeepSeek赋能职场 第三课:普通人如何抓住DeepSeek红利 第四课:让科研像聊天一样简单 第五课:DeepSeek与AI幻觉 第六课:基于DeepSeek的AI音乐词曲的创造法 第…...

jupyter使用过程中遇到的问题

1、No module named ‘notebook.extensions’ 报错内容为: No module named notebook.extensions解决办法 出现这个错误代表你尝试给 Jupyter notebook 安装自动补全的插件,但是 notebook 没安装成功; 解决办法:不用 pip 安装 n…...

mac vim命令快捷键

目录 移动光标插入模式复制/粘贴删除搜索/替换退出 移动光标 快捷键说明0 / ^跳到行首,移动到光标所在行的"行首"$跳到行末,移动到光标所在行的"行尾"gg跳到文件第一行G移动到文章的最后[n]G跳到第n行w光标跳到下个字的开头e光标跳…...

【Golang】defer与recover的组合使用

在Go语言中,defer和recover是两个关键特性,通常结合使用以处理资源管理和异常恢复。以下是它们的核心应用场景及使用示例: 1. defer 的应用场景 defer用于延迟执行函数调用,确保在函数退出前执行特定操作。主要用途包括&#xff…...

低代码配置式Web组态解析

低代码配置式Web组态技术通过可视化操作和预置组件库,大幅降低开发门槛,适用于工业控制、物联网监控、数据可视化等场景。以下是综合行业实践和产品特性的分析: ‌一、核心功能与优势‌ ‌可视化编辑与拖拽布局‌ 提供图形化编辑器&#xff0…...

KiLog2MaximumIncrement的由来和KiMaximumIncrementReciprocal的由来

第一部分&#xff1a;KiLog2MaximumIncrement的由来 i 1; j KeMaximumIncrement; while ((1UI64<<i) < KeMaximumIncrement) { i; } KiLog2MaximumIncrement i; 2^17131072 2^18262144 i18KiLog2MaximumIncrement 中…...

基于web的家政服务网站

内容摘要 由于互联网的使用&#xff0c;人们在管理、应用、服务等领域使用数据更加简洁、方便&#xff0c;大大提高了工作效率。互联网正逐渐融入我们的生活&#xff0c;影响和改变我们的生活。 家政服务管理系统是典型的信息管理系统&#xff08;MIS&#xff09;。其开发主要…...

mac命令行快捷键

光标移动 Ctrl A: 将光标移动到行首。Ctrl E: 将光标移动到行尾。Option 左箭头: 向左移动一个单词。Option 右箭头: 向右移动一个单词。 删除和修改 Ctrl K: 删除从光标到行尾的所有内容。Ctrl U: 删除从光标到行首的所有内容。Ctrl W: 删除光标前的一个单词。Ctrl …...

聚水潭数据集成到MySQL的最佳实践分享

聚水潭数据集成到MySQL的技术案例分享 在本次技术案例中&#xff0c;我们将探讨如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据高效、可靠地集成到MySQL数据库中。具体的集成方案为“聚水潭-商品信息查询-->BI初本-商品信息表_copy”。该方案旨在实现从聚水潭获取商…...

线性代数核心概念与NumPy科学计算实战全解析

前言 学习方法&#xff1a; 思维导图&#xff0c;梳理 多记忆&#xff0c;函数名和功能&#xff0c;参数 学会应用&#xff0c;不要钻牛角尖 一、浅解线性代数 1.1标量 标量是一个只有大小没有方向的量。在数学上&#xff0c;标量通常表示为一个普通的数字&#xff0c;如‌质量…...

Spring Boot中接口数据字段为 Long 类型时,前端number精度丢失问题解决方案

Spring Boot中接口数据字段为 Long 类型时&#xff0c;前端number精度丢失问题解决方案 在Spring Boot中&#xff0c;当接口数据字段为 Long 类型时&#xff0c;返回页面的JSON中该字段通常会被序列化为数字类型。 例如&#xff0c;一个Java对象中有一个 Long 类型的属性 id …...

C#自定义曲线便器功能实现(简化版)

目录 一、曲线编辑器实现功能 二、实现方法说明 三、关键代码说明 1、绘制背景板和曲线 2、绘制坐标系面板 3、绘制曲线 四、工程下载连接 一、曲线编辑器实现功能 添加或者删除控制点&#xff0c;通过移动控制点来修改曲线形状 二、实现方法说明 1、坐标系系统&#x…...

Unity Shader编程】之复杂光照

在Unity Shader的LightMode标签中&#xff0c;除了前向渲染和延迟渲染外&#xff0c;还支持多种渲染模式设置。以下是主要分类及用途&#xff1a; 一、核心渲染路径模式 前向渲染相关 ForwardBase 用于基础光照计算&#xff0c;处理环境光、主平行光、逐顶点/SH光源及光照贴图。…...

解锁U盘属性0字节困境,重获数据生机

在数字化浪潮中&#xff0c;U盘宛如一位忠诚的“数据信使”&#xff0c;频繁穿梭于各种设备之间&#xff0c;为我们存储和传输着重要信息。然而&#xff0c;当U盘突然显示属性为0字节时&#xff0c;就如同这位信使突然“失声”&#xff0c;让我们陷入了数据丢失的恐慌之中。U盘…...

⭐算法OJ⭐二叉树的直径【树】(C++实现)Binary Tree Paths

543. Binary Tree Paths&#xff08;二叉树的直径&#xff09; Given the root of a binary tree, return the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or m…...

docker使用命令笔记

docker使用命令笔记 1. 安装docker2. 拉取镜像3. 镜像与容器4. 基于镜像创建容器4. 操作创建好的容器5. docker文件传输6. ubuntu的docker的一些基本环境搭建 记录docker的一些使用命令 1. 安装docker 遵循官方安装说明即可&#xff0c;windows需要下载docker desktop后在doc…...

字典树与01trie

字典树简介 当我们通过字典查一个字或单词的时候&#xff0c;我们会通过前缀或关键字的来快速定位一个字的位置&#xff0c;进行快速查找。 字典树就是类似字典中索引表的一种数据结构&#xff0c;能够帮助我们快速定位一个字符串的位置。 字典树是一种存储字符串的数据结构…...

vue - [Vue warn]: Duplicate keys detected: ‘0‘. This may cause an update error.

问题描述&#xff1a; vue项目中&#xff0c;对表单数组赋值时&#xff0c;控制台抛出警告&#xff1a; 问题代码&#xff1a; 问题分析&#xff1a; 1、Vue 要求每个虚拟 DOM 节点必须有唯一的 key。该警告信息通常出现在使用v-for循环的场景中&#xff0c;多个同级节点使用…...

mysql中show命令的使用

在 MySQL 中&#xff0c;SHOW 命令是一个非常实用的工具&#xff0c;用于查询数据库元数据&#xff08;如数据库、表、列、索引等信息&#xff09;。以下是常见的 SHOW 命令及其用法&#xff1a; 1. 显示所有数据库 SHOW DATABASES;列出服务器上的所有数据库。 2. 显示当前数据…...

各类神经网络学习:(三)RNN 循环神经网络(中集),同步多对多结构的详细解释

上一篇下一篇RNN&#xff08;上集&#xff09;RNN&#xff08;下集&#xff09; 同步多对多结构 1&#xff09;结构详解 ①图解&#xff1a; ②参数含义&#xff1a; x t x_t xt​ &#xff1a;表示每一个时刻的输入&#xff1b; o t o_t ot​ &#xff1a;表示每一个时刻的输…...

Python Web 框架 Django、Flask 和 FastAPI 对比

在探索 Python Web 框架时&#xff0c;Django、Flask 和 FastAPI 无疑是最常被提及的名字。根据我们最新的 Python 开发者调查&#xff0c;这三大框架继续稳坐后端 Web 开发的热门宝座。它们均为开源项目&#xff0c;并且与 Python 的最新版本无缝兼容。然而&#xff0c;面对不…...

Hyperlane 似乎是一个轻量级、高性能的 Rust HTTP 服务器库

关键要点 Hyperlane 是一个轻量级、高性能的 Rust HTTP 服务器库&#xff0c;适合简化网络服务开发。它支持 HTTP 请求解析、响应构建、TCP 通信&#xff0c;并提供中间件、WebSocket 和服务器发送事件&#xff08;SSE&#xff09;功能。安装通过 cargo add hyperlane 完成&am…...

【计算机网络运输层详解】

文章目录 一、前言二、运输层的功能1. 端到端通信2. 复用与分用3. 差错检测4. 流量控制5. 拥塞控制 三、运输层协议&#xff1a;TCP 和 UDP1. TCP&#xff1a;面向连接的可靠传输协议2. UDP&#xff1a;无连接的传输协议 四、端口号与进程通信1. 端口号分类2. 端口通信模型 五、…...

UR5e机器人位姿

UR5e 作为一款 6 自由度协作机器人&#xff0c;其末端执行器的位姿&#xff08;位置与姿态的组合&#xff09;控制是实现精准操作的核心。在笛卡尔坐标系中&#xff0c;位姿通常用齐次变换矩阵表示&#xff0c;包含末端的三维位置&#xff08;x, y, z&#xff09;和三维姿态&am…...

导入 Excel 规则批量修改或删除 PDF 文档内容

需要对 PDF 文档内容进行修改的时候&#xff0c;通常我们会需要借助一些专业的工具来帮我们完成。那我们如果需要修改的 PDF 文档较多的时候&#xff0c;有什么方法可以帮我们实现批量操作呢&#xff1f;今天这篇文章就给大家介绍一下当我们需要批量修改多个 PDF 文档的时候&am…...

大模型tokenizer重构流程

大模型tokenizer层再训练&#xff08;选取Qwen7B试验&#xff0c;重构token层&#xff09; 最近公司可能想训练一个蛋白质大模型&#xff0c;需要了解一下大模型tokenizer重构&#xff0c;之后可能要训练&#xff0c;这里做了一定的总结。 文章目录 1. 首先查看Qwen2.5 7B基本…...

JAVA线程安全的集合类分类

1. 传统同步集合类&#xff08;早期实现&#xff0c;性能较低&#xff09;‌ ‌Vector‌ 动态数组实现&#xff0c;所有方法通过 synchronized 同步锁保证线程安全‌。 ‌Stack‌ 继承自 Vector&#xff0c;实现后进先出&#xff08;LIFO&#xff09;堆栈&#xff0c;同步锁机…...

ISIS-1 ISIS概述

前面几章我们介绍了OSPF的基础工作原理以及怎样交互LSA形成LSDB链路状态数据库的 这一章我们来介绍另一个链路状态路由协议,ISIS路由协议 一、概述 ISIS(Intermediate System to Intermediate System,中间系统到中间系统)是由ISO(International Organization for Standardiza…...

茱元游戏TV2.9.3 | 适配多设备的经典街机游戏集合

茱元游戏TV是一款专为TV端设计的游戏软件&#xff0c;同时适配手机、投影仪和车机等多种设备。尽管其兼容性一般&#xff0c;仅支持安卓9.0以上系统&#xff0c;但它提供了丰富的经典街机游戏资源&#xff0c;非常适合8090后怀旧游玩。注意&#xff0c;游戏需先下载才能玩&…...