首页 > 其他分享 >Harmony开发-ArkUI框架速成十二Grid网格布局

Harmony开发-ArkUI框架速成十二Grid网格布局

时间:2025-01-09 10:29:10浏览次数:3  
标签:Color Text 100% 1fr width Grid Harmony ArkUI

程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴!君志所向,一往无前!


网格布局 Grid

1.Grid

如果布局是由 很多的 行 和 列 所组成、行列可能需要合并、甚至滚动,就可以使用网格布局来实现

因为网格布局可以实现很多种不同的效果:

  1. 固定行列数量(不滚动)

  2. 合并行列(不滚动)

  3. 设置滚动

  4. 代码控制滚动

  5. 自定义滚动条

2.固定行列

首先来看看如何实现固定行列、不滚动

  1. Grid的子组件必须是GridItem组件,需要展示的内容设置在 GridItem 内部既可

  2. GridItem 只能有一个子组件

  3. 宽高分为 2 种情况:

  • a. Grid组件设置了宽高属性: 则其尺寸为设置值。

  • b. Grid组件没有设置宽高属性: Grid组件的尺寸默认继承y其父组件的尺寸。

我们实现一个:

  1. 容器宽高:100%、300

  2. 行列占比如下:

@Entry
@Component
struct Index {
  build() {
    Column() {
      Text('程序员Feri')
        .fontSize(20)
        .fontWeight(900)
        .padding(10)
      Grid() {
        GridItem() {
          Text('1')
            .fontColor(Color.White)
            .fontSize(30)
        }
        .backgroundColor(Color.Blue)

        GridItem() {
          Text('2')
            .fontColor(Color.White)
            .fontSize(30)
        }
        .backgroundColor(Color.Blue)

        GridItem() {
          Text('3')
            .fontColor(Color.White)
            .fontSize(30)
        }
        .backgroundColor(Color.Blue)

        GridItem() {
          Text('4')
            .fontColor(Color.White)
            .fontSize(30)
        }
        .backgroundColor(Color.Blue)

        GridItem() {
          Text('5')
            .fontColor(Color.White)
            .fontSize(30)
        }
        .backgroundColor(Color.Blue)

        GridItem() {
          Text('6')
            .fontColor(Color.White)
            .fontSize(30)
        }
        .backgroundColor(Color.Blue)
      }
      .border({ width: 1 })
      .columnsTemplate('1fr 2fr 1fr')
      .rowsTemplate('1fr 1fr')
      .width('100%')
      .height(360)
      .columnsGap(10)
      .rowsGap(10)
    }
    .width('100%')
    .height('100%')
  }
}

3.合并行列

接下来看看如何合并行列,不滚动

日常开发中除了大小相同的等比例网格布局,由不同大小的网格组成不均匀分布的网格布局场景在实际应用中也十分常见,如下图所示。

如果要实现这个效果 通过 GridItem 的如下属性即可:

@Entry
@Component
struct Index {
  // 快速生成 12 个元素的数组
  // Array.from 是 Array 这个类上面的静态方法
  // {length:12} 是一个对象,有 length 属性,值为 12
  nums: number[] = Array.from({ length: 12 })

  build() {
    Column() {
      Text('Grid的合并行列')
        .fontSize(20)
        .fontWeight(900)
        .padding(10)
      Grid() {
        ForEach(this.nums, (item: number, index: number) => {
          if (index === 2) {
            GridItem() {
              Text(index + '')
                .fontColor(Color.White)
                .fontSize(30)
            }
            .backgroundColor('#9dc3e6')
            .columnStart(3)
            .columnEnd(4)
          } else if (index === 3) {
            GridItem() {
              Text(index + '')
                .fontColor(Color.White)
                .fontSize(30)
            }
            .backgroundColor('#9dc3e6')
            .rowStart(2)
            .rowEnd(3)
          } else {
            GridItem() {
              Text(index + '')
                .fontColor(Color.White)
                .fontSize(30)
            }
            .backgroundColor('#9dc3e6')
          }

        })
      }
      .columnsTemplate('1fr 1fr 1fr 1fr')
      .rowsTemplate('1fr 1fr 1fr')
      .width('100%')
      .height(260)
      .rowsGap(10)
      .columnsGap(10)
      .padding(10)
    }
    .width('100%')
    .height('100%')
  }
}

4.设置滚动

日常开发中,可以滚动的网格布局也经常出现,比如文件管理、购物、视频列表等

设置方式:

  1. 水平滚动:设置的是rowsTemplate,Grid的滚动方向为水平方向。

  2. 垂直滚动:设置的是columnsTemplate,Grid的滚动方向为垂直方向

// 为 Text 扩展属性 newExtend
// newExtend 设置了一些Text 组件的属性
@Extend(Text)
function newExtend() {
  .width('100%')
  .height('100%')
  .fontSize(30)
  .fontColor(Color.White)
  .textAlign(TextAlign.Center)
}

@Entry
@Component
struct Index {
  // 长度为 10 每一项都为 undefined 的数组
  list: string[] = Array.from({ length: 30 })

  build() {
    Column() {
      Text('Grid的滚动效果')
        .fontSize(20)
        .fontWeight(900)
        .padding(10)
      Grid() {
        ForEach(this.list, (item: string, index) => {
          GridItem() {
            Text((index + 1).toString())
              .newExtend()
          }
          .padding(5)
          .backgroundColor('#0094ff')
          .height('25%') // 竖向滚动-通过 height 设置高度
          .width('25%') // 横向滚动 通过 width 设置宽度
        })

      }
      .columnsTemplate('1fr 1fr 1fr') // 竖向滚动 固定列数
      .rowsGap(10)
      .columnsGap(10)
      .width('100%')
      .height(300)
      .border({ width: 1 })
      .padding(5)
    }
    .width('100%')
    .height('100%')
  }
}

5.控制器对象-自定义滚动条

如果默认的滚动条外观无法满足要求,我们还可以自定义滚动条

核心步骤:

  1. 隐藏默认滚动条

  2. 使用ScrollBar组件自定义滚动条

  • a. ScrollBar 和 Grid 设置同一个 Scroller(控制器对象)

  • b. 通过 参数 和 属性控制 ScrollBar

第一步:通过 Grid 的 scrollBar 属性关闭滚动条,具体的属性和取值如下所示:

第二步:使用ScrollBar组件自定义滚动条

完整代码如下所示:

// 为 Text 扩展属性 newExtend
// newExtend 设置了一些Text 组件的属性
@Extend(Text)
function newExtend() {
  .width('100%')
  .height('100%')
  .fontSize(30)
  .fontColor(Color.White)
  .textAlign(TextAlign.Center)
}

@Entry
@Component
struct Index {
  // 长度为 10 每一项都为 undefined 的数组
  list: string[] = Array.from({ length: 30 })

  scroller:Scroller =new Scroller()

  build() {
    Column() {
      Text('Grid的滚动效果')
        .fontSize(20)
        .fontWeight(900)
        .padding(10)
      Grid(this.scroller) {
        ForEach(this.list, 
        (item: string, index) => {
          GridItem() {
            Text((index + 1)+'')
              .newExtend()
          }
          .padding(5)
          .backgroundColor('#0094ff')
          .height('25%') // 竖向滚动-通过 height 设置高度
          .width('25%') // 横向滚动 通过 width 设置宽度
        })
      }
      .rowsTemplate('1fr 1fr 1fr') // 横向滚动 固定列数
      .rowsGap(10)
      .width('100%')
      .height(300)
      .border({ width: 1 })
      .padding(5)
      .scrollBar(BarState.Off)//关闭 滚动条

      // 自定义滚动条
      ScrollBar({
        scroller: this.scroller,// 和 Grid 同一个控制器对象
        direction: ScrollBarDirection.Horizontal,
      }) {
        Text()
          .width(40)
          .height(20)
          .backgroundColor(Color.Orange)
      }
      .width(200)
      .height(20)
      .backgroundColor(Color.Red)
    }
    .width('100%')
    .height('100%')
  }
}

好啦,本篇关于Grid网格就说到这里啦,关注我,跟着我一起起飞!

标签:Color,Text,100%,1fr,width,Grid,Harmony,ArkUI
From: https://blog.csdn.net/u014332200/article/details/145026527

相关文章

  • Xinstall HarmonyOS SDK:助力鸿蒙生态,开启智能应用新篇章!应用集成即享10天专业版免费使
    10月22日,华为正式发布了HarmonyOSNEXT原生鸿蒙系统。自问世以来,凭借其独特的分布式特性与创新交互,在智能设备领域掀起了一场革新风暴,吸引着无数开发者投身其中,探索无限可能。目前,已有超1万个应用和元服务上架HarmonyOSNEXT应用市场,华为开发者联盟注册开发者数量已增长......
  • 【HarmonyOS应用开发——ArkTS语言】购物商城的实现【合集】
    目录......
  • HarmonyOS Next 日志知识一文搞定
    HarmonyOSNext日志知识一文搞定日志是日常开发中必不可少的调试工具,好的日志工具和日志调用可以帮助我们快速定位开发中或者线上问题,极大提高开发效率。HarmonyOSNext除了支持TS的console打印日志外,还提供了hilog工具,可以在ArkTS层和C++层实现日志输出,此外我们还可以使......
  • 【c# WPF贪吃蛇教程】Grid与UniformGrid一对异姓兄弟在二维世界玩蛇之幻觉让我骑大蛇
    前言    经过前面两次的贪吃蛇项目,我已经完全掌握了突破二维次元的绝对力量,一定要把小蓝(一只老鼠)从次壁中解救出来,键盘磨出的斑驳深痕被老祖的天门法眼洞悉,赐予我两枚绝域神器,分别是Grid和UniformGrid,奈何不好驾驭,但也阻挡不了我战胜蛇蛇的决心。。。    项......
  • 笔记 HarmonyOS:ArkTS-回顾
    1.声明式UI开发:2.组件语法容器组件(参数){内容}.属性1().属性2().属性...()普通组件(参数).属性1().属性2().属性...() 3.typeof运算符functionfunc(){numb:Number}classPerson{name:string='Tom'}@Entry@ComponentstructTypeofPage{......
  • HarmonyOS介绍
    鸿蒙开发HarmonyOS概述什么是HarmonyOS1HarmonyOS中文名字是鸿蒙操作系统、2HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。3鸿蒙操作系统在传统的单设备系统能力的基础上,提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持多种终端设备。......
  • DevExpress WinForms中文教程:Grid View - 如何实现列的可见性
    DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!本文将为大家介绍如何使用DevExpressWinFormsDat......
  • opencv中findCirclesGrid在标定时使用,blobDetector 参数怎么定义?
    在OpenCV中,findCirclesGrid是一个用于检测图像中的圆形格点(通常用于相机标定或校正的检测目标)的函数。它可以用于查找在特定模式下排列的圆形图案,如棋盘格或圆形网格。该函数是相机标定和立体视觉的重要工具。函数原型boolcv::findCirclesGrid(InputArrayimage,S......
  • WPF add System.Windows.Forms.PropertyGrid via WindowsFormsHost
    1.AddreferenceSystem.Windows.Forms.dll;2.Addreference C:\ProgramFiles\ReferenceAssemblies\Microsoft\Framework\v3.0\WindowsFormsIntegration.dll3.//xaml<Windowx:Class="WpfApp131.MainWindow"xmlns="http://schemas.mi......
  • WPF call Windows.Forms.PropertyGrid in xaml
    1.AddreferenceSystem.Windows.Forms;2.Addreference C:\ProgramFiles\ReferenceAssemblies\Microsoft\Framework\v3.0\WindowsFormsIntegration.dll3.<Windowx:Class="WpfApp132.MainWindow"xmlns="http://schemas.microsoft.com......