理解 HarmonyOS 中的网格布局:综合指南

news2024/11/14 15:10:29

网格布局是创建响应式和结构化用户界面的强大工具。通过将界面划分为由行和列组成的单元格,网格可以精确控制组件的分布和对齐。这使得它们成为各种应用程序(例如图库、日历和计算器)的理想选择。

在 HarmonyOS 中,ArkUI 提供了用于构建网格布局的Grid容器和GridItem组件。Grid组件用于定义网格的结构,而GridItem组件指定每个单元格内的内容。HarmonyOS 网格支持条件渲染、循环渲染和延迟加载等高级功能,以高效处理大型数据集。

布局和约束

组件Grid充当网格容器,每个网格项由一个GridItem组件表示。它们之间的关系如下:

Grid
└── GridItem
    └── Component

注意: Grid组件必须只能包含GridItem作为子组件的组件。

网格布局本质上是二维的,提供垂直和水平排列功能。它们可以适应容器尺寸的变化,确保响应式设计。根据设置,您可以创建各种网格布局,例如下面显示的布局:

Grid Layout Variants
└── Evenly Distributed Grid
└── Asymmetrical Grid
└── Scrollable Grid

关键行为:

  • 如果同时设置了Grid组件的宽度和高度,它将占据指定的尺寸。
  • 如果未设置尺寸,则将Grid适应其父容器的大小。

组件Grid的布局根据行和列的配置可以分为三种类型:

  1. **固定行和列:**显示固定数量的元素而不滚动。
  2. **动态行或列:**根据设置的行数或列数,以可滚动的布局显示元素。
  3. **灵活布局:**根据方向和网格大小布局元素,如果不适合则隐藏多余的元素。
配置行和列

网格布局的整体结构通过设置行数和列数以及它们的尺寸比例来定义。Grid组件使用rowsTemplatecolumnsTemplate属性来实现此目的。

例子:

Grid() {
  ...
}
.rowsTemplate('1fr 1fr 1fr') // Three equally sized rows
.columnsTemplate('1fr 2fr 1fr') // Three columns, with the middle column twice the size of the others

**注意:**设置rowsTemplate或时,其他属性(如、和)将被忽略。columnsTemplate``layoutDirection``maxCount``minCount

管理跨越和不对称

在实际应用中,网格通常包含跨多行或多列的项目,例如计算器键或日历日期。这可以通过配置来实现GridLayoutOptions

例子:

layoutOptions: GridLayoutOptions = {
  regularSize: [1, 1],
  onGetRectByIndex: (index: number) => {
    if (index == key1) { // Key "0"
      return [5, 0, 1, 2]
    } else if (index == key2) { // Key "="
      return [4, 3, 2, 1]
    }
  }
}

Grid(undefined, this.layoutOptions) {
  // Grid content here
}
.columnsTemplate('1fr 1fr 1fr 1fr')
.rowsTemplate('2fr 1fr 1fr 1fr 1fr 1fr')

此代码将“0”键跨越两列,将“=”键跨越两行。

设置布局方向

如果您未设置行和列模板,则可以使用来layoutDirection确定项目在网格内的排列方式。

例子:

Grid() {
  ...
}
.maxCount(3)
.layoutDirection(GridDirection.Row) // Items will fill rows first

行为:

  • **行方向:**项目按从左到右的顺序排列,并根据需要换行到下一行。
  • **列方向:**项目按从上到下的顺序排列,并换行到下一列。
以网格布局显示数据

网格布局可以有效地显示一组项目,尤其是当内容相似时,例如服务列表。

例子:

@Entry
@Component
struct OfficeService {
  @State services: Array<string> = ['Meeting', 'Check-in', 'Vote', 'Print']

  build() {
    Column() {
      Grid() {
        ForEach(this.services, (service:string) => {
          GridItem() {
            Text(service)
          }
        }, (service:string):string => service)
      }
      .rowsTemplate(('1fr 1fr') as string)
      .columnsTemplate(('1fr 1fr') as string)
    }
  }
}

在这里插入图片描述

管理网格项之间的间距

rowsGap可以使用和属性来控制行和列之间的空间columnsGap

例子:

Grid() {
  ...
}
.columnsGap(10) // 10px gap between columns
.rowsGap(15) // 15px gap between rows
创建可滚动的网格

可滚动网格对于显示大量内容(例如在文件管理器或购物应用中)至关重要。当仅设置rowsTemplate或之一时columnsTemplate,网格将变为可滚动的。

例子:

@Entry
@Component
struct Shopping {
  @State services: Array<string> = ['Live', 'Imports']

  build() {
    Column({ space: 5 }) {
      Grid() {
        ForEach(this.services, (service: string, index) => {
          GridItem() {
          }
          .width('25%')
        }, (service:string):string => service)
      }
      .rowsTemplate('1fr 1fr') // Scrolls horizontally if content exceeds width
      .rowsGap(15)
    }
  }
}
控制滚动位置

网格中的滚动控制对于用户体验至关重要,例如翻阅日历中的页面。

例子:

private scroller: Scroller = new Scroller()

Column({ space: 5 }) {
  Grid(this.scroller) {
  }
  .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr')

  Row({space: 20}) {
    Button('Previous Page')
      .onClick(() => {
        this.scroller.scrollPage({
          next: false
        })
      })

    Button('Next Page')
      .onClick(() => {
        this.scroller.scrollPage({
          next: true
        })
      })
  }
}
使用延迟加载进行性能优化

对于大型数据集,建议使用延迟加载来优化性能。您可以使用该cachedCount属性控制网格项的预加载,以确保平滑滚动。

例子:

Grid() {
  LazyForEach(this.dataSource, () => {
    GridItem() {
    }
  })
}
.cachedCount(3) // Preload 3 items before and after the visible area

**注意:**增加cachedCount可改善用户体验,但可能会增加 CPU 和内存的使用率。

结论

HarmonyOSGrid组件是一款多功能工具,可用于创建复杂且响应迅速的网格布局。无论您是构建简单的网格还是复杂的可滚动界面,了解和利用各种属性和选项都可以让您创建高效且具有视觉吸引力的设计。

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

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

相关文章

代码随想录算法训练营day30 | 贪心算法 | 452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间

文章目录 452.用最少数量的箭引爆气球思路 435.无重叠区间思路 763.划分字母区间思路问题的转化 总结 今天是贪心算法专题的第四天&#xff0c;今天的三道题目&#xff0c;都算是 重叠区间 问题&#xff0c;大家可以好好感受一下。 都属于那种看起来好复杂&#xff0c; 但一看…

携手共创商业新纪元,聚贤国际成都分部正式成立

成大事者&#xff0c;聚于府都。2024年8月10日&#xff0c;在成都这个西部经济中心城市&#xff0c;聚贤国际成都分部正式成立&#xff0c;标志着聚贤国际商会在这片营商沃土落地生根。 本次成都分部成立&#xff0c;特别邀请到聚贤国际创始人刘芒芒及聚贤国际商会三亚分部、海…

ubuntu20.04源码编译安装qemu(qemu8.2)

ubuntu20.04源码安装qemu8.2 本文用于记录在ubuntu20中源码编译安装qemu8.2&#xff0c;同时也希望能够对你有所帮助。 一、download qemu 根据自己的需求下载对应版本的qemu源码压缩包。 https://github.com/qemu/qemu/tags二、build qemu 解压缩后&#xff0c;执行下述命令。…

一文读懂高通GPU驱动渲染流程

1. gpu command分析 1.1 gpu command概述 SM8650平台上&#xff0c;GLES发送给KMD&#xff08;GPU驱动&#xff09;的GPU命令有两种类型&#xff1a;同步命令和绘制命令。 绘制命令&#xff0c;一般都是一个个的drawcall组成的&#xff0c;是真正GPU程序指令&#xff0c;KMD会给…

自动分班实用工具

开学前夕&#xff0c;老师们的日程表上又添上了一笔笔的工作任务。分班&#xff0c;作为开学前的一项重要工作&#xff0c;不仅关系到学生的学习环境&#xff0c;也是家长们关注的焦点。 易查分&#xff0c;让分班变得简单 易查分小程序的出现&#xff0c;为老师们提供了一种全…

Vercel 的 AI 工具 V0.dev:如何使用它?

几个月前&#xff0c;Vercel 宣布推出了 V0.dev&#xff0c;这是一款专为开发人员和设计师设计的工具&#xff0c;能够使用 AI 生成 React 代码。最初&#xff0c;V0.dev 对外开放时采用了邀请制&#xff0c;但如今拥有 Vercel 帐户的任何人都可以访问并使用它。 这些工具填补…

计算机专业的 “铁饭碗” 终于被发现啦

计算机专业毕业后只能当码农吗&#xff1f;大错特错❌&#xff01;其实计算机专业考公真的非常有优势呢&#xff01;张雪峰就曾说过&#xff1a;“计算机在考公的时候&#xff0c;有那种 yyds 的感觉&#xff0c;是所有单位都要。”&#x1f603; &#x1f33b;计算机类专业包…

音频播放+音频采样(绘制音波)

引言 在 iOS 平台中&#xff0c;实现音频播放有多种方式。AVAudioPlayer 是一个专门用于播放音频数据的类&#xff0c;易于使用&#xff0c;适合处理简单的音频播放需求。而 AVPlayer 则是一种更通用的播放器&#xff0c;既能播放视频资源&#xff0c;也能处理音频内容&#x…

Linux:Linux线程池

目录 线程池的概念 线程池的优点 线程池的应用场景 线程池的实现 线程池演示 线程池的概念 线程池是一种线程使用模式。 线程过多会带来调度开销&#xff0c;进而影响缓存局部和整体性能&#xff0c;而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的…

长视频生成研究的挑战、方法与前景

人工智能咨询培训老师叶梓 转载标明出处 长视频生成面临的主要挑战包括如何在有限的计算资源下生成长时间、高一致性、内容丰富且多样化的视频序列。另外现有研究中对于“长视频”的定义并不统一&#xff0c;这给研究的标准化和比较带来了困难。来自西安电子科技大学、上海交通…

Window 安装Gogs教程

1、下载 下载地址&#xff1a;https://gogs.io/docs/installation/install_from_binary.html(请自行科学上网 选择Windows amd64(64位)或者386(32位) 2、安装 2.1 将压缩文件放到目标文件夹 2.2 创建数据库 在本地数据库或者其他目标数据库新建查询执行下列SQL语句 找到go…

taskBus的设计局限和吞吐能力测试

在前文中&#xff0c;我们介绍了EPDR技术的起源&#xff0c;以及使用该技术驱动的业余软件无线电平台专栏。已有玩家通过踩坑证明&#xff0c;进程管道交换数据时间延迟大&#xff08;10ms&#xff09;&#xff0c;构造时间敏感系统难。除非采用传统的紧耦合设计及更大的颗粒度…

尚品汇-选中状态缓存变更、删除缓存购物车(三十八)

目录&#xff1a; &#xff08;1&#xff09;选中状态的变更 &#xff08;2&#xff09;删除购物车 &#xff08;3&#xff09;流程总结 &#xff08;1&#xff09;选中状态的变更 用户每次勾选购物车的多选框&#xff0c;都要把当前状态保存起来。由于可能会涉及更频繁的操…

基于AT89C51单片机的可手动定时控制的智能窗帘设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89469560?spm=1001.2014.3001.5503 C 源码+仿真图+毕业设计+实物制作步骤+11 摘要 I abstract II 第1章 绪论 1 1.1 背景及意义 1 1.2 国内外发展现状 1 1.3 设计思想及基…

ChatGPT等大模型高效调参大法——PEFT库的算法简介

随着ChatGPT等大模型&#xff08;Large Language Model&#xff09;的爆火&#xff0c;而且目前业界已经发现只有当模型的参数量达到100亿规模以上时&#xff0c;才能出现一些在小模型无法得到的涌现能力&#xff0c;比如 in_context learing 和 chain of thougt。深度学习似乎…

Excel如何快速的定位到某一列和快速知道当前列

Excel如何快速的定位到某一列和快速知道当前列 背景快速找到某一列---660列快速知道当前列 背景 由于某一次做excel数据太大需要快速知道某一列是多少列和快速定位到某一列对此写了这个 快速找到某一列—660列 SUBSTITUTE(ADDRESS(1, 660, 4), "1", ""…

实现MySQL的主从复制基础

目录 1 MySQL实现主从复制的原理 1.1 实现主从复制的规则 1.2 如何实现主从复制 2 MySQL 实现主从复制实践 2.1 实验环境 2.2 my.cnf 配置添加 2.2.1 配置MSTER 端配置文件 2.2.2 配置SLAVE 端配置文件 2.2.3 三台MySQL服务器重启服务 2.3 创建用于复制的用户 2.4 保证三台主机…

Android实战:过root检测

在启动这个app时&#xff0c;我们会看到一个提示&#xff0c;表示设备处于root环境。如下图所示&#xff1a; 为了过掉到这个root检测&#xff0c;我们可以通过直接Hook Toast.show()方法&#xff0c;并打印调用堆栈信息来实现定位关键代码。以下是相关的Frida脚本代码&#…

esxi 安装 精简版win10

镜像来源&#xff1a;[【不忘初心】Windows10 22H2 (19045.4780) X64 无更新 纯净[深度精简版]1.27G](https://www.pc528.net/22h2s.html) 提供下载地址&#xff1a;https://www.123pan.cn/s/lYtRVv-Wmuf3?提取码:GaD4 先把下载esd 转成iso安装 把下载的esd 重命名为install…

如何使用ssm实现学生宿舍管理

TOC ssm094学生宿舍管理jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样…