Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >鸿蒙开发:loading动画的几种实现方式

鸿蒙开发:loading动画的几种实现方式

原创
作者头像
程序员一鸣
发布于 2025-06-15 08:38:43
发布于 2025-06-15 08:38:43
1600
举报

前言

本文基于Api13

这两天在优化一些功能,发现之前网路库中的oading动画是通过帧动画实现的,而刷新库中的动画却是直接使用的GIF,而到了另一个项目中则又是通过属性动画的方式实现的,索性就针对这几种实现方式简单总结一下,希望可以帮助到有需要的朋友。

首先,我们要知道一点,想要实现一个动态的图片,不仅仅是以上的几种方式,使用lottie也可以实现,所以在实际的开发中,应当根据自身需求需要,选择一种合适的即可。

GIF的实现方式

GIF无疑是实现动态图片的最简单的方式,只需要一个GIF图片便可以搞定,这种方式也是最省心省力的。

只需要把loading的GIF图给Image组件设置即可:

代码语言:typescript
AI代码解释
复制
Column() {
        Image($r("app.media.loading"))
          .width(40)
          .height(40)
        Text("加载中…")
          .margin({ top: 20 })
      }
      .width(130)
      .height(130)
      .backgroundColor(Color.White)
      .borderRadius(10)
      .justifyContent(FlexAlign.Center)

效果如下:

如果你需要控制GIF的播放速度以及暂停,继续播放等动作,可以结合官方推荐的开源库ohos-gif-drawable来实现。

帧动画

帧动画,可以使用ohos.animator来实现,但是我们也可以使用帧动画组件ImageAnimator来实现,它可以实现逐帧播放图片的能力,仅配置需要播放的图片列表就可以轻松完成一个图片的动画效果。

要想实现帧动画的无限次播放,需要设置iterations属性为-1,在组件挂载显示后进行运行帧动画,在组件卸载消失时停止掉针动画。

定义数据

代码语言:typescript
AI代码解释
复制
 @State state: AnimationStatus = AnimationStatus.Initial
  private images: Array<ImageFrameInfo> = [
    { src: $r("app.media.loading001") },
    { src: $r("app.media.loading002") },
    { src: $r("app.media.loading003") },
    { src: $r("app.media.loading004") },
    { src: $r("app.media.loading005") },
    { src: $r("app.media.loading006") },
    { src: $r("app.media.loading007") },
    { src: $r("app.media.loading008") },
    { src: $r("app.media.loading009") },
    { src: $r("app.media.loading010") },
    { src: $r("app.media.loading011") },
    { src: $r("app.media.loading012") }
  ]

代码实现

代码语言:typescript
AI代码解释
复制
Column() {
        ImageAnimator()
          .images(this.images)
          .state(this.state)
          .fixedSize(true)
          .fillMode(FillMode.None)
          .iterations(-1)
          .width(40)
          .height(40)
        Text("加载中…")
          .margin({ top: 20 })
          .fontColor(Color.White)
      }
      .width(130)
      .height(130)
      .backgroundColor("#80000000")
      .borderRadius(10)
      .justifyContent(FlexAlign.Center)
      .onAppear(() => {
        this.state = AnimationStatus.Running
      })
      .onDisAppear(() => {
        this.state = AnimationStatus.Stopped
      })

运行之后,效果如下:

属性动画

使用属性动画就比较简单了,只需要一张静态的图片便可以搞定,让图片360度无限次旋转即可,需要注意的是,改变旋转角度的属性,应定义在组件加载完成之后,相关代码如下:

代码语言:typescript
AI代码解释
复制
@Entry
@Component
struct Index {
  @State rotateValue: number = 0

  build() {
    Column() {

      Column() {
        Image($r('app.media.loading001'))
          .rotate({ angle: this.rotateValue })
          .width(40)
          .height(40)
          .rotate({
            angle: this.rotateValue
          })
          .animation({
            duration: 1000,
            iterations: -1,
            playMode: PlayMode.Normal,
            curve: Curve.Linear
          })

        Text("加载中…")
          .margin({ top: 20 })
          .fontColor(Color.White)
      }
      .width(130)
      .height(130)
      .backgroundColor("#80000000")
      .borderRadius(10)
      .justifyContent(FlexAlign.Center)
      .onAppear(() => {
        this.rotateValue = 360
      })

    }.width('100%')
    .height("100%")
    .justifyContent(FlexAlign.Center)

  }

}

以上的代码和上面的效果差不多,但是需要控制播放的速度,可以通过animation中的duration来控制。

显式动画

以上的效果,我们也可以使用animateTo显示动画来实现,基本参数和属性动画类似,实现方式如下:

代码语言:typescript
AI代码解释
复制
@Entry
@Component
struct Index {
  @State rotateValue: number = 0

  build() {
    Column() {

      Column() {
        Image($r('app.media.loading001'))
          .rotate({ angle: this.rotateValue })
          .width(40)
          .height(40)
        Text("加载中…")
          .margin({ top: 20 })
          .fontColor(Color.White)
      }
      .width(130)
      .height(130)
      .backgroundColor("#80000000")
      .borderRadius(10)
      .justifyContent(FlexAlign.Center)

    }.width('100%')
    .height("100%")
    .justifyContent(FlexAlign.Center)

  }

  onDidBuild(): void {
    animateTo({
      duration: 1000,
      iterations: -1,
      playMode: PlayMode.Normal,
      curve: Curve.Linear
    }, () => {
      this.rotateValue = 360
    })
  }
}

相关总结

基本上没什么难的,都是非常简单的动画实现,虽然是一个loading动画,但是也可以应用与其他需要动画的地方。

本文标签:HarmonyOS/ArkUI

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
116.[HarmonyOS NEXT 实战案例:健康应用] 进阶篇 - 健康数据仪表盘的交互功能与状态管理
在基础篇中,我们学习了如何使用HarmonyOS NEXT的RowSplit组件构建健康数据仪表盘的基本布局。本篇教程将进一步深入,讲解如何为健康数据仪表盘添加交互功能和状态管理,使应用更加动态和用户友好。我们将重点关注数据切换、状态同步、动画效果等进阶特性,帮助你构建一个功能完善的健康数据仪表盘。
全栈若城
2025/06/12
1100
116.[HarmonyOS NEXT 实战案例:健康应用] 进阶篇 - 健康数据仪表盘的交互功能与状态管理
HarmonyOS NEXT仓颉开发语言实战案例:健身Ap
这个页面看起比之前的案例要稍微复杂一些,主要在于顶部部分,有重叠的背景,还有偏移的部分。重叠布局可以使用Stack容器实现,超出容器范围的偏移可以使用负数间距来实现,顶部部分的具体实现代码如下:
幽蓝计划
2025/06/29
580
鸿蒙开发:了解帧动画
所谓帧动画,就是类似播放电影一样,一帧一帧的进行播放,相对于属性动画,其每一帧,我们都可以进行设置相关的属性值,并且具有暂停播放,继续播放的优点,而且还具备事件的实时响应,需要说明的是,在性能上是远远不如属性动画的,所以如果能用属性动画实现的场景,还是主推属性动画。
程序员一鸣
2024/12/30
1940
鸿蒙开发:了解帧动画
详解鸿蒙Next仓颉开发语言中的动画
仓颉中的动画通常有两种方式,分别是属性动画和显示动画,我们今天以下面的加载动画为例,使用显示动画和属性动画分别实现一下,看看他们有什么区别。
幽蓝计划
2025/06/08
1520
150. [HarmonyOS NEXT 实战案例十一:List系列] 下拉刷新和上拉加载更多列表组件实战:打造高效新闻应用 进阶篇
在基础篇中,我们学习了如何使用HarmonyOS NEXT的List和Refresh组件实现具有下拉刷新和上拉加载更多功能的新闻列表。本篇教程将在此基础上,探讨更多进阶特性和优化技巧,帮助你打造一个功能更加丰富、用户体验更加流畅的新闻应用。
全栈若城
2025/06/30
1610
鸿蒙开发学习:动画
使用animation属性去定义动画的属性,需要注意的点是,如果在animation方法后定义的属性,在改变时将不会触发动画。
钟子翔
2024/12/24
1000
鸿蒙(HarmonyOS)性能优化实战-合理使用renderGroup
在大型业务场景开发过程中,为了提升产品的视觉效果,经常大量使用属性动画和转场动画,当业务场景复杂度达到一定程度之后,就有可能出现卡顿的情况。本文推荐在单一页面上存在大量应用动效的组件时,使用renderGroup方法来解决卡顿问题,从而提升绘制性能。
小帅聊鸿蒙
2024/10/17
1910
鸿蒙(HarmonyOS)性能优化实战-合理使用renderGroup
鸿蒙特效教程05-鸿蒙很开门
屏幕上有一个双开门,点击中间的按钮后,两侧门会向打开,露出开门后面的内容。当用户再次点击按钮时,门会关闭。
苏杰豪
2025/03/26
920
鸿蒙特效教程05-鸿蒙很开门
132.[HarmonyOS NEXT 实战案例五:SideBarContainer] 侧边栏容器实战:悬浮模式侧边栏(Overlay)进阶篇
在基础篇中,我们已经实现了移动端抽屉菜单的基本布局和功能。在本篇教程中,我们将深入探讨如何通过状态管理和交互功能增强,使侧边栏更加智能和易用。
全栈若城
2025/06/30
1330
鸿蒙仓颉语言开发实战教程:商城应用个人中心页面
我们可以先分析下整个页面的布局结构。可以看出它是纵向的布局,整个页面由导航栏、个人资料、vip横条和我的订单几部分构成。
幽蓝计划
2025/06/17
860
131.HarmonyOS NEXT 实战案例五:SideBarContainer 侧边栏容器实战:悬浮模式侧边栏(Overlay)
在移动应用开发中,侧边栏导航是一种常见的UI模式,它可以在不占用主屏幕空间的情况下提供丰富的导航选项。HarmonyOS NEXT的SideBarContainer组件提供了多种显示模式,其中Overlay模式特别适合移动设备的侧边栏菜单实现。
全栈若城
2025/06/30
1430
鸿蒙智联汽车【1.0】
智能汽车是集环境感知、规划决策、多等级辅助驾驶等功能于一体的智能网联综合系统,它集中运用了计算机、现代传感、信息融合、通讯、人工智能及自动控制等技术,是典型的高新技术综合体。简单的说,智能汽车的出现将逐步放松车、手、眼,让开车,用车变得简单。这样的产品对有本儿不敢上路的人来说或许是大大的福音。
徐建国
2022/12/05
7500
鸿蒙智联汽车【1.0】
OpenHarmony标准设备应用开发(二)——布局、动画与音乐
本章是 OpenHarmony 标准设备应用开发的第二篇文章。我们通过知识体系新开发的几个基于 OpenHarmony3.1 Beta 标准系统的样例:分布式音乐播放、传炸弹、购物车等样例,分别介绍下音乐播放、显示动画、动画转场(页面间转场)三个进阶技能。首先我们来讲如何在 OpenHarmony 中实现音乐的播放。
小帅聊鸿蒙
2025/04/09
1630
OpenHarmony标准设备应用开发(二)——布局、动画与音乐
纯血鸿蒙APP实战开发——自定义TabBar
本示例主要介绍了TabBar中间页面如何实现有一圈圆弧外轮廓以及TabBar页签被点击之后会改变图标显示,并有一小段动画效果。
小帅聊鸿蒙
2024/12/27
2060
纯血鸿蒙APP实战开发——自定义TabBar
66. [HarmonyOS NEXT 实战案例七] 健身课程网格布局(下)
在上一篇教程中,我们学习了如何使用GridRow和GridCol组件实现基本的健身课程网格布局。本篇教程将在此基础上,深入探讨如何优化布局、添加交互功能,以及实现更多高级特性,打造一个功能完善的健身课程应用。
全栈若城
2025/06/06
760
HarmonyOS 开发实践 —— 基于ArkUI的动效能力
控制输入框的宽度和显隐状态实现第一段动画,输入框的缩放动画完成后onFinish隐藏输入框,同时展示加载动画。
小帅聊鸿蒙
2024/12/20
1000
HarmonyOS 开发实践 —— 基于ArkUI的动效能力
鸿蒙特效教程02-微信语音录制动画效果实现教程
这些技术和概念不仅适用于这个特定效果,还可以应用于各种交互设计中。希望这个教程能帮助你更好地理解HarmonyOS开发,并创建出更加精美的应用界面!
苏杰豪
2025/03/26
1410
鸿蒙特效教程02-微信语音录制动画效果实现教程
鸿蒙(HarmonyOS)性能优化实战-应用程序动效能力实践
本文介绍如何在开发应用程序时合理地使用动效,来获得更好的性能。主要通过减少布局和属性的变更频次,避免冗余刷新,从而降低性能开销。
小帅聊鸿蒙
2024/10/23
2160
鸿蒙(HarmonyOS)性能优化实战-应用程序动效能力实践
鸿蒙Next仓颉语言开发实战教程:店铺详情页
这个页面的内容看似简单,其实有很多小细节需要注意,主要还是让大家熟悉List容器的使用。
幽蓝计划
2025/06/09
760
鸿蒙特效教程07-九宫格幸运抽奖
首先,我们需要创建一个基础页面结构和定义数据模型。通过定义奖品的数据结构,为后续的九宫格布局做准备。
苏杰豪
2025/03/26
1450
鸿蒙特效教程07-九宫格幸运抽奖
推荐阅读
相关推荐
116.[HarmonyOS NEXT 实战案例:健康应用] 进阶篇 - 健康数据仪表盘的交互功能与状态管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档