HarmonyOS Lottie动画库总结

✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向) 🐳博客主页: 开源中国稀土掘金51cto博客博客园知乎简书慕课网CSDN

🔔如果文章对您有一定的帮助请👉关注✨、点赞👍、收藏📂、评论💬。

🔥如需转载请参考【转载须知】

HarmonyOS 开发中使用 Lottie 动画库

一、什么是 Lottie?

简介

Lottie 是由 Airbnb 团队开发并开源的跨平台动画库,支持在 iOS、Android、Web、React Native、Windows 和 HarmonyOS 等平台解析并播放使用 Adobe After Effects 制作、通过 Bodymovin 插件导出的 JSON 动画文件

推荐使用lottie-turbo:声明式调用更加简洁,支持并行加载、内存缓存、子线程渲染,性能优化30%+,多动画/复杂动画场景下UI界面更流畅。

相比传统的帧动画或手动编写动画代码,Lottie 提供了更轻量、更流畅、更高效的动画解决方案,大幅提升了 UI 表现力和开发效率。

📌 Lottie 官网地址:
airbnb.design/lottie

注意:此地址为官方介绍页面,非 HarmonyOS 使用地址。


二、Lottie 的优势

  1. 🎨 高保真动画呈现:高度还原设计师在 AE 中的动画设计;
  2. 📦 资源体积小:相比 GIF 和视频,JSON 动画更轻量;
  3. 🔁 支持交互与循环:可控制播放、暂停、进度、循环等;
  4. 🧩 跨平台复用性强:一份动画 JSON 可在多个平台共用;
  5. 性能优越:利用硬件加速渲染,播放流畅资源消耗低。

三、HarmonyOS 中如何使用 Lottie?

在 HarmonyOS ArkTS 项目中,可以通过官方或三方组件 @ohos/lottie 使用 Lottie 动画。

1. 安装依赖

使用命令安装:

bash 复制代码
ohpm install @ohos/lottie

或在 module.json5 中添加依赖:

json 复制代码
"dependencies": {
  "@ohos/lottie": "1.0.0" // 请根据实际版本号填写
}

三方包地址(OpenHarmony 官方源):

🔗 ohpm.openharmony.cn/#/cn/detail...


2. 动画 JSON 文件的放置与使用场景

场景 放置目录 加载方式 注意事项
✅ 本地加载 entry/src/main/ets/common 使用相对路径:common/xxx.json 推荐开发调试或轻量动画使用
✅ 网络加载 - 直接传入 URL,如 http://... 需声明权限(见下方)
✅ HSP 加载 resources/rawfile/ 使用 $rawfile('xxx.json') 推荐正式发布使用(资源内置)
📌 网络资源加载需声明权限:
json 复制代码
"reqPermissions": [
  { "name": "ohos.permission.INTERNET" },
  { "name": "ohos.permission.GET_NETWORK_INFO" }
]

四、ArkTS 示例代码

1. 简单的使用

  • 將动画需要的json文件放到pages同级别目录下,然后引用。(json路径为entry/src/main/ets/common/lottie/data.json)

注意:json文件路径不能使用 ./ 或者 .../ 等相对路径,相对路径获取不到动画源数据,会导致动画加载不出来。

2.关联画布

kotlin 复制代码
 Canvas(this.mainCanvasRenderingContext)
        .width('50%')
        .height(360 + 'px')
        .backgroundColor(Color.Gray)
        .onReady(()=>{
        //抗锯齿的设置
            this.mainCanvasRenderingContext.imageSmoothingEnabled = true;
            this.mainCanvasRenderingContext.imageSmoothingQuality = 'medium';
        })

注意:canvas设置的宽高比例建议和动画json资源里面的宽高比例一致,如:json动画资源里的宽高比例是 1:2 ,则canvas设置的宽高也是 1:2。

3.加载动画

  • 加载动画的时机需要注意,点击按钮加载动画可按照正常逻辑放在点击事件内,如果想要实现进入页面自动播放动画,需要结合Canvas组件的onReady()生命回调周期实现,加载动画时机需放置在onReady()生命周期回调内或及之后。
  • 同一Canvas组件加载多次/不同动画资源,需要手动销毁动画(lottie.destroy('name')),之后才可再次加载其他动画资源。
kotlin 复制代码
lottie.destroy('2016'); //加载动画前先销毁之前加载的动画
    this.animationItem = lottie.loadAnimation({
            container: this.mainCanvasRenderingContext,  // 渲染上下文
            renderer: 'canvas',                          // 渲染方式
            loop: true,                                  // 是否循环播放,默认true
            autoplay: true,                              // 是否自动播放,默认true
            name: '2016',                                // 动画名称
            contentMode: 'Contain',                      // 填充的模式
            frameRate: 30,                               //设置animator的刷帧率为30
            imagePath: 'lottie/images/',                 // 加载读取指定路径下的图片资源
            path: this.path,                             // json路径
            initialSegment: [10,50]                      // 播放的动画片段
          })
     或      
    lottie.loadAnimation({
            container: this.mainCanvasRenderingContext,  // 渲染上下文
            renderer: 'canvas',                          // 渲染方式
            loop: true,                                  // 是否循环播放,默认true
            autoplay: true,                              // 是否自动播放,默认true
            contentMode: 'Contain',                      // 填充的模式
            frameRate: 30,                               //设置animator的刷帧率为30
            animationData: this.jsonData,                // json对象数据
            initialSegment: [10,50]                      // 播放的动画片段
          })
     或
    lottie.loadAnimation({
            uri: "https://assets7.lottiefiles.com/packages/lf20_sF7uci.json",  // uri网络资源
            container: this.canvasRenderingContext,                            // 渲染上下文
            renderer: 'canvas',                                                // canvas 渲染模式
            loop: true,                                                        // 是否循环播放,默认true
            autoplay: true,                                                    // 是否自动播放,默认true
            name: this.animateName,                                            // 动画名
          })

五、常用属性说明

使用方法 类型 相关描述
play() name? 播放
stop() name? 停止
pause() name? 暂停
togglePause() name? 切换暂停
destroy() name? 销毁动画

在官网说明上有两个使用属性说明AnimationItem 和 LottiePlayer 都属于 HarmonyOS @ohos/lottie 动画库提供的能力,它们各自代表不同的使用层级或场景。下面是它们的区别和使用建议:

🔹 1、概念理解

AnimationItem

是指一个 具体的动画实例 ,通常是通过调用 loadAnimation() 返回的对象,对这个对象的操作就是针对某一个动画进行控制。

LottiePlayer

是一个 全局静态控制器或动画管理器,用于从全局角度控制动画播放(如同一个名字的多个实例、当前页面或当前Ability中的动画等),属于更底层或跨组件的控制方式。


🔸 2、区别对比

对比项 AnimationItem LottiePlayer
📌 代表含义 单个 Lottie 动画实例 全局/统一的动画控制类
📦 典型获取方式 const item = loadAnimation(params) 直接调用类方法如 LottiePlayer.play()
📍 控制范围 控制该实例 控制全局、指定 name 的动画
🔁 支持多个动画控制 ✅ 支持多个实例独立控制 ⚠️ 主要支持通过 name 控制已命名动画
🧩 生命周期管理 需手动 destroy() 销毁 可全局 destroy(name)
⏱️ 使用场景 通常在组件内单独控制 多页面、全局统一控制、调试等
💡 示例调用 item.play() LottiePlayer.play('loading')

🔸 3、使用建议

场景 推荐使用
在组件或页面中局部播放一个动画(如按钮动画、加载动画) AnimationItem
需要跨页面统一控制某些动画(如登录页和首页都需播放/销毁同一动画) LottiePlayer
想实现同一动画资源的多实例、不同状态控制 AnimationItem
使用 canvas 等高级特性,需要关联 context2d LottiePlayer
清理缓存、设置全局播放方向、统一帧率等 LottiePlayer

🔹 4、实际开发中的配合使用示例

php 复制代码
// 加载动画并返回 AnimationItem 实例
const anim = LottiePlayer.loadAnimation({
  name: 'loading',
  path: $rawfile('loading_animation.json'),
  autoplay: true,
  loop: true,
  container: 'lottieContainer'
})

// 单独控制某个动画实例
anim.setSpeed(1.5)
anim.pause()
anim.goToAndPlay(60)

// 通过 LottiePlayer 全局控制
LottiePlayer.pause('loading') // 控制所有名称为 loading 的动画
LottiePlayer.setSpeed(2.0, 'loading')
LottiePlayer.destroy('loading')

🔸 5、总结

功能需求 使用推荐
控制单个动画实例 AnimationItem(面向对象)
控制多个命名动画或全局状态 LottiePlayer(面向服务)
涉及 canvas / context2D 联动 LottiePlayer
与组件生命周期强绑定 AnimationItem
动画复用、缓存管理等系统级控制 LottiePlayer

六、开发建议与注意事项

  1. 建议使用 $rawfile() 加载正式动画资源,避免路径错误;
  2. ⚠️ 动画文件不要过大,否则影响首屏加载时间;
  3. 提前压缩优化 JSON,可减少解析开销;
  4. 注意平台兼容性差异,复杂动画请在目标设备测试;
  5. ⚙️ 控制频繁动画销毁和复用,避免内存泄露。

七、总结

Lottie 为 HarmonyOS 开发者带来了极大的动画表现力提升,不仅能减少前端动画开发工作量,更能与设计师协作无缝衔接。通过合理使用 Lottie,开发者可以在应用中打造更出色的用户体验。

🎯 如果你正在开发启动页动画、加载动效、空页面占位动画、按钮反馈动画等,Lottie 都是一个极具性价比的方案!


📁 三种资源放置方式建议

场景 是否推荐 放置路径 说明
✅ 正式发布使用(推荐) ★★★★☆ resources/rawfile/ 使用 $rawfile('xxx.json'),系统自动打包,路径可靠
✅ 本地资源 ★★★☆☆ entry/src/main/ets/common 可快速修改、无需打包,但路径易错
✅ 加载网络资源 ★★★☆☆ 无需本地目录 支持远程 CDN,适用于动画变动频繁场景,但依赖网络、需授权权限

仓库地址

OpenHarmony三方库:ohpm.openharmony.cn/#/cn/detail...

OpenHarmony源码地址:gitcode.com/openharmony...

👍 点赞,是我创作的动力! ⭐️ 收藏,是我努力的指引! ✏️ 评论,是我进步的宝藏! 💖 衷心感谢你的阅读以及支持!

本文使用 文章同步助手 同步

相关推荐
zhanshuo6 分钟前
新手也能搞定!鸿蒙开发者资源包获取与实战全流程指南
harmonyos
楚轩努力变强40 分钟前
前端工程化常见问题总结
开发语言·前端·javascript·vue.js·visual studio code
鱼樱前端42 分钟前
rust基础二(闭包)
前端·rust
菜鸟学Python1 小时前
Python web框架王者 Django 5.0发布:20周年了!
前端·数据库·python·django·sqlite
前端开发爱好者1 小时前
只有 7 KB!前端圈疯传的 Vue3 转场动效神库!效果炸裂!
前端·javascript·vue.js
pe7er1 小时前
RESTful API 的规范性和接口安全性如何取舍
前端·后端
Fly-ping1 小时前
【前端】JavaScript文件压缩指南
开发语言·前端·javascript
未来之窗软件服务2 小时前
免费版酒店押金原路退回系统之【房费押金计算器】实践——仙盟创梦IDE
前端·javascript·css·仙盟创梦ide·东方仙盟·酒店押金系统
拾光拾趣录3 小时前
常见 HTTP 请求头:从“为什么接口返回乱码”说起
前端·http
阿华的代码王国3 小时前
【Android】卡片式布局 && 滚动容器ScrollView
android·xml·java·前端·后端·卡片布局·滚动容器