【愚公系列】2023年12月 HarmonyOS教学课程 012-ArkUI组件(Grid/GridItem)

本文详细介绍了华为ArkUI中的Grid和GridItem组件在实现网格布局中的关键特性,如设置行列数量与占比、子组件排列、可滚动布局和长网格处理。作者作为技术专家,分享了实际案例和布局技巧,适用于.NET、Java等开发者的响应式设计实践。

在这里插入图片描述

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2023年华为云十佳博主,2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏


🚀一、Grid/GridItem

🔎1.概述

网格布局是一种新型的布局方式,它按照网格来划分页面,通过列和行来定义网格,使得页面的布局更加灵活、简洁、易于维护。网格布局能够将页面分成多个单元格,可以在这些单元格中布置各种元素,例如文本、图片、媒体等,从而实现页面的排版。网格布局支持自适应布局,能够轻松地实现响应式设计,支持多终端设备的显示。

ArkUI提供了Grid容器组件和子组件GridItem,用于构建网格布局。Grid用于设置网格布局相关参数,GridItem定义子组件相关特征。Grid组件支持使用条件渲染、循环渲染、懒加载等渲染控制方式生成子组件。

🔎2.布局与约束

1、Grid与GridItem组件关系
在这里插入图片描述
Grid的子组件必须是GridItem组件

2、网格布局
在这里插入图片描述
Grid组件支持自定义行列数和每行每列尺寸占比、设置子组件横跨几行或者几列,同时提供了垂直和水平布局能力

🔎3.设置排列方式

🦋3.1 设置行列数量与占比

通过设置行列数量与尺寸占比,可以确定网格布局的整体排列方式。Grid组件提供了rowsTemplate和columnsTemplate属性,用于设置网格布局的行列数量与尺寸占比。 rowsTemplate和columnsTemplate属性值是一个由多个空格和’数字+fr’间隔拼接的字符串,其中fr的个数即为网格布局的行或列数。数字表示该行或列在网格布局宽度上的占比,最终决定该行或列的宽度。

Grid() {
  ...
}
.rowsTemplate('1fr 1fr 1fr')
.columnsTemplate('1fr 2fr 1fr')

在这里插入图片描述

🦋3.2 设置子组件所占行列数

1、0的设置

GridItem() {
  Text(key)
    ...
}
.columnStart(1)
.columnEnd(2)

在这里插入图片描述
2、=号的设置

GridItem() {
  Text(key)
    ...
}
.rowStart(5)
.rowEnd(6)

在这里插入图片描述

🦋3.3 设置主轴方向

Grid() {
  ...
}
.maxCount(3)
.layoutDirection(GridDirection.Row)

在这里插入图片描述

🔎4.案例

🦋4.1 在网格布局中显示数据

@Entry
@Component
struct Index {
  build() {
    Grid() {
      GridItem() {
        Text('会议')
      }

      GridItem() {
        Text('签到')
      }

      GridItem() {
        Text('投票')
      }

      GridItem() {
        Text('打印')
      }
    }
    .rowsTemplate('1fr 1fr')
    .columnsTemplate('1fr 1fr')
  }
}

在这里插入图片描述

🦋4.2 设置行列间距

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

在这里插入图片描述

🦋4.3 构建可滚动的网格布局(官方)

@Component
struct Shopping {
  @State services: Array<string> = ['直播', '进口', ...]
  ...

  build() {
    Column({ space: 5 }) {
      Grid() {
        ForEach(this.services, (service: string, index) => {
          GridItem() {
            ...
          }
          .width('25%')
        }, service => service)
      }
      .rowsTemplate('1fr 1fr') // 只设置rowsTemplate属性,当内容超出Grid区域时,可水平滚动。
      .rowsGap(15)
      ...
    }
    ...
  }
}

在这里插入图片描述
滑动后
在这里插入图片描述

🦋4.4 在网格布局中显示数据(官方)

private scroller: Scroller = new Scroller()
Column({ space: 5 }) {
  Grid(this.scroller) {
    ...
  }
  .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr')
  ...
 
 Row({space: 20}) {
   Button('上一页')
     .onClick(() => {
       this.scroller.scrollPage({
         next: false
       })
     })

   Button('下一页')
     .onClick(() => {
       this.scroller.scrollPage({
         next: true
       })
     })
 }
}
...

在这里插入图片描述

🦋4.5 长网格处理

和长列表类似就不做多说了

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

🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

<think> 我们被要求回答关于ArkUI动画的使用方法、示例和实现原理。根据引用,我们可以总结以下要点: 1. ArkUI组件提供通用属性动画和转场动画能力(引用[1])。 2. 动画曲线分为物理曲线和传统曲线,推荐使用物理曲线(引用[2])。 3. 可以通过animateTo接口实现动画效果(引用[3])。 4. 组件动画示例(引用[4])。 5. 页面转场动画(引用[5])。 因此,我们将从以下几个方面展开: - 属性动画:通过改变组件的样式属性(如宽高、位置、透明度等)实现的动画。 - 转场动画:组件出现或消失时的过渡效果。 - 页面转场:页面跳转时的动画效果。 同时,我们将提供示例代码并解释原理。 ### 1. 属性动画 属性动画是最基础的动画形式,通过改变组件的属性值(如宽、高、透明度、位置等)来实现动画效果。在ArkUI中,可以使用`animateTo`方法来实现。 **示例:** 点击按钮改变方块的宽度和透明度。 ```typescript @Entry @Component struct PropertyAnimationExample { @State widthSize: number = 150 @State opacitySize: number = 1.0 build() { Column() { Button('开始动画') .onClick(() => { // 使用animateTo执行属性动画 animateTo({ duration: 1000, // 动画时长(毫秒) curve: Curve.EaseIn // 使用传统缓入曲线 }, () => { if (this.widthSize === 150) { this.widthSize = 300 this.opacitySize = 0.5 } else { this.widthSize = 150 this.opacitySize = 1.0 } }) }) // 应用动画的组件 Text('方块') .width(`${this.widthSize}vp`) .height('150vp') .backgroundColor(Color.Blue) .opacity(this.opacitySize) .margin({ top: 30 }) } .width('100%') .height('100%') .justifyContent(FlexAlign.Center) } } ``` **原理:** 在`animateTo`的闭包中改变状态变量,ArkUI框架会自动识别这些变量的变化,并在指定的时间内平滑过渡。 ### 2. 转场动画 转场动画用于组件插入或移除时的动画效果。ArkUI提供了`transition`方法设置组件的转场效果。 **示例:** 添加或移除组件时使用淡入淡出和缩放效果。 ```typescript @Entry @Component struct TransitionAnimationExample { @State flag: boolean = true build() { Column() { Button('切换显示') .onClick(() => { this.flag = !this.flag }) if (this.flag) { // 使用转场动画 Text('Hello World') .fontSize(20) .margin(20) .transition({ // 设置转场参数 type: TransitionType.Insert, // 插入时动画 opacity: 0, // 初始透明度 scale: { x: 0, y: 0 } // 初始缩放 }, () => { // 使用animateTo来触发转场动画 animateTo({ duration: 1000 }) }) .transition({ type: TransitionType.Delete, // 删除时动画 opacity: 0, scale: { x: 0, y: 0 } }, () => { animateTo({ duration: 1000 }) }) } } .width('100%') .height('100%') .justifyContent(FlexAlign.Center) } } ``` ### 3. 页面转场动画 页面转场动画用于页面跳转时的过渡效果。在`pageTransition`方法中定义页面进入和退出的动画。 **示例:** 自定义页面进入和退出动画。 ```typescript // 在页面组件中 @Entry @Component struct PageTransitionExample { build() { Column() { // 页面内容 } .width('100%') .height('100%') .backgroundColor(Color.White) } // 页面转场动画 pageTransition() { PageTransitionEnter({ duration: 500 }) .slide(SlideEffect.Right) // 从右侧滑入 PageTransitionExit({ duration: 500 }) .slide(SlideEffect.Left) // 向左侧滑出 } } ``` **原理:** 在页面组件中定义`pageTransition`方法,通过`PageTransitionEnter`和`PageTransitionExit`分别设置进入和退出动画。ArkUI框架在页面跳转时会自动应用这些动画。 ### 动画曲线 动画曲线(`curve`)用于控制动画的速度变化。ArkUI提供了两种类型: - **传统曲线**:如线性(`Linear`)、缓入(`EaseIn`)、缓出(`EaseOut`)、缓入缓出(`EaseInOut`)等。 - **物理曲线**:模拟物理世界的弹簧效果(`Spring`),更加自然。 **物理曲线示例:** ```typescript animateTo({ duration: 1000, curve: Curve.Spring({ // 使用物理弹簧曲线 mass: 1, // 质量 stiffness: 100, // 刚度 damping: 10 // 阻尼 }) }, () => { // 状态变化 }) ``` ### 实现原理 ArkUI的动画系统基于以下原理: 1. **声明式UI**:通过状态驱动UI更新,动画只是状态变化的过渡效果。 2. **帧动画**:在每一帧中根据动画曲线计算当前属性值,并更新UI。 3. **合成与优化**:ArkUI框架会对多个动画进行合并和优化,保证性能。 ### 注意事项 1. **性能优化**:避免在动画中频繁更新大量组件,以免影响性能。 2. **动画曲线选择**:优先使用物理曲线,使动画更自然。 3. **转场动画**:确保组件在`if`或`ForEach`等条件渲染语句中,才能触发转场效果。 ### 相关问题 1. ArkUI中如何实现多个动画的同步执行? 2. 如何自定义物理弹簧曲线的参数? 3. ArkUI支持哪些类型的转场动画效果? 4. 如何实现组件拖拽时的弹性效果? 5. 页面转场动画如何与导航路由结合使用? </think> ### ArkUI动画使用指南 #### 一、ArkUI动画核心概念 ArkUI提供两大类动画能力: 1. **组件动画**:针对单个组件的属性变化动画[^1] 2. **转场动画**:组件出现/消失时的过渡效果[^5] 动画曲线类型: - **物理曲线**:符合物理规律(如弹簧效果),推荐优先使用[^2] - **传统曲线**:缓入/缓出等常规动画曲线[^2] #### 二、属性动画实现方法 使用`animateTo`接口修改组件属性实现动画效果: ```typescript @Entry @Component struct AnimationExample { @State widthValue: number = 100 @State opacityValue: number = 1.0 build() { Column() { Button('开始动画') .onClick(() => { // 使用animateTo执行动画 animateTo({ duration: 1000, // 动画时长(ms) curve: Curve.Spring // 使用物理弹簧曲线[^2] }, () => { this.widthValue = (this.widthValue === 100) ? 200 : 100 this.opacityValue = (this.opacityValue === 1.0) ? 0.5 : 1.0 }) }) // 应用动画的组件 Text('动画元素') .width(`${this.widthValue}vp`) .height(100) .backgroundColor(Color.Blue) .opacity(this.opacityValue) .margin(20) } .width('100%') .height('100%') .justifyContent(FlexAlign.Center) } } ``` 效果:点击按钮时元素宽度和透明度平滑过渡,带有弹性效果 #### 三、转场动画实现方法 实现组件插入/删除时的过渡效果: ```typescript @Entry @Component struct TransitionExample { @State show: boolean = true build() { Column() { Button('切换显示') .onClick(() => { animateTo({ duration: 500 }, () => { this.show = !this.show }) }) if (this.show) { Text('动态组件') .fontSize(20) .margin(20) .transition({ // 转场配置 type: TransitionType.Insert, // 插入动画 opacity: 0, // 初始透明度 translate: { x: 100, y: 0 } // 初始位置 }) .transition({ type: TransitionType.Delete, // 删除动画 opacity: 0, scale: { x: 0, y: 0 } // 缩小时消失 }) } } .width('100%') .height('100%') .justifyContent(FlexAlign.Center) } } ``` 效果:组件出现时从右侧滑入,消失时缩小淡出 #### 四、页面转场动画 实现页面跳转时的过渡效果: ```typescript // 页面A @Entry @Component struct PageA { build() { Column() { Navigator({ target: 'pages/PageB' }) { Button('前往页面B') } } } // 页面转场配置 pageTransition() { PageTransitionEnter({ duration: 800 }) .slide(SlideEffect.Bottom) // 从底部滑入 PageTransitionExit({ duration: 800 }) .opacity(0) // 淡出效果 } } // 页面B @Component struct PageB { build() { Text('页面B内容') } pageTransition() { PageTransitionEnter({ duration: 800 }) .slide(SlideEffect.Right) // 从右侧滑入 PageTransitionExit({ duration: 800 }) .slide(SlideEffect.Left) // 向左侧滑出 } } ``` 效果:从A到B时,B从右侧滑入,A淡出;返回时B向左滑出,A从底部滑入[^5] #### 五、物理弹簧曲线示例 ```typescript animateTo({ duration: 1500, curve: Curve.Spring({ // 物理弹簧参数 mass: 1, // 质量 (默认1) stiffness: 200, // 刚度 (默认100) damping: 10 // 阻尼 (默认10) }) }, () => { // 状态变化 }) ``` 效果:元素移动带有弹性振动效果,更符合自然规律[^2] #### 六、实现原理 1. **声明式驱动**:通过状态变量变化触发动画 2. **帧调度**:系统在每帧渲染前计算属性中间值 3. **插值计算**:根据动画曲线计算属性过渡值 $$ property_t = startValue + (endValue - startValue) \times f(\frac{t}{duration}) $$ 其中 $f$ 为动画曲线函数 4. **GPU加速**:复杂动画使用硬件加速保证流畅性 ### 相关问题 1. 如何实现ArkUI中的连续动画序列? 2. 物理弹簧曲线的参数如何影响动画效果? 3. 如何在List组件中实现项动画效果? 4. ArkUI动画性能优化的最佳实践有哪些? 5. 如何自定义ArkUI的动画曲线? 6. 动画过程中如何获取当前进度值? [^1]: 引用自鸿蒙开发基础 —— ArkUI 组件动画 [^2]: 引用自HarmonyOS核心知识点:ArkUI动画曲线 [^3]: 引用自HarmonyOS开发实战:ArkUI动画接口animateTo实现书籍翻页动效 [^4]: 引用自【鸿蒙实战开发】ArkUI-组件动画详解 [^5]: 引用自【愚公系列202312月 HarmonyOS教学课程 034-ArkUI动画(页面转场动画)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚公搬代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值