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

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

前言

本文基于Api13

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

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

GIF的实现方式

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

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

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,在组件挂载显示后进行运行帧动画,在组件卸载消失时停止掉针动画。

定义数据

 @State state: AnimationStatus = AnimationStatus.Initialprivate 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") }]

代码实现

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度无限次旋转即可,需要注意的是,改变旋转角度的属性,应定义在组件加载完成之后,相关代码如下:

@Entry
@Component
struct Index {@State rotateValue: number = 0build() {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显示动画来实现,基本参数和属性动画类似,实现方式如下:

@Entry
@Component
struct Index {@State rotateValue: number = 0build() {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

http://www.xdnf.cn/news/12661.html

相关文章:

  • 欧拉定理和费马定理
  • 人工智能会导致人类毁灭吗
  • 所有的Linux桌面环境
  • 从微积分到集合论(1630-1910)(历史简介)——第4章——现代积分理论的起源(Thomas Hawkins)
  • 13.MySQL用户管理
  • 【C/C++】不同防止头文件重复包含的措施
  • 【同数增位累加2+22+222+2222】2022-4-15
  • 广目软件GM DC Monitor
  • 驱控边界在哪里?知名舵机品牌伟创动力CNTE2025展带来答案
  • c# List<string>.Add(s) 报错:UnsupportedOperationException
  • antd-vue - - - - - table实现滚动加载数据
  • 什么是上下文切换?代价在哪里?
  • C++ if语句完全指南:从基础到工程实践
  • API是什么意思?如何实现开放API?
  • 开源语义分割工具箱mmsegmentation基于Lovedata数据集训练模型
  • 你如何确保监控系统的可用性?
  • python算法-移动零盛最多的水--Day021
  • WinCC学习系列-变量模拟器(WinCC TAG Simulator )
  • Wan2.1环境的安装,以及使用产品图片合成展示视频
  • 嵌入式主板详解与选购指南
  • 关于dropbear ssh服务
  • 如何让其他品牌更难转化走我们的用户?
  • thinkphp-queue队列随笔
  • Dubbo学习(一):Dubbo介绍
  • C#使用MindFusion.Diagramming框架绘制流程图(1):基础类型
  • 服务器出现故障怎么办?快速排查与解决方法
  • dfn序的应用 (P1273 有线电视网题解)
  • ROS1: 使用rosbag的方式将点云topic保存为pcd文件
  • 中小制造企业的数字化转型,如何控制工业软件应用成本?
  • Docker 容器化基础:镜像、容器与仓库的本质解析