OpenHarmony UI动画-lottie

news2024/12/28 22:08:19

简介

lottie是一个适用于OpenHarmony的动画库,它可以解析Adobe After Effects软件通过Bodymovin插件导出的json格式的动画,并在移动设备上进行本地渲染。

下载安裝

 ohpm install @ohos/lottie

OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包

使用说明

前提:数据准备

lottie动画文件是由设计人员使用Adobe After Effects软件通过bodymovin插件导出json格式的文件。

AE软件创建动画时需要设置动画的宽(w)、高(h)、bodymovin插件的版本号(v)、帧率(fr)、开始帧(ip)、
结束帧(op)、静态资源信息(assets)、图层信息(layers)等重要信息。

如果仅是用于demo测试,可以使用工程示例中的json文件 。

1.在相应的类中引入组件:

import lottie from '@ohos/lottie'

2.构建渲染上下文

  private mainRenderingSettings: RenderingContextSettings = new RenderingContextSettings(true)
  private mainCanvasRenderingContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.mainRenderingSettings)

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

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

传递给loadAnimation 方法的路径是相对于pages父文件夹为基准的,而index页面内引入的相对路径的动画是以index.ets文件为基准的,两者基准不一致。

所以如果json文件放置在pages文件夹下,路径应为 ‘pages/common/data.json’ 样式

  private path:string = "common/lottie/data.json"
  或
  private jsonData:string = {"v":"4.6.6","fr":24,"ip":0,"op":72,"w":1000,"h":1000,"nm":"Comp 2","ddd":0,"assets":[],...}

4.关联画布

       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

  • 想要的抗锯齿效果:mainCanvasRenderingContext.imageSmoothingEnabled = true 与 mainCanvasRenderingContext.imageSmoothingQuality = ‘medium’

  • 动画绘制前会对canvas画布进行清空处理,画布清空后再绘制动画。

  • 5.加载动画

  • 加载动画的时机需要注意,点击按钮加载动画可按照正常逻辑放在点击事件内,如果想要实现进入页面自动播放动画,需要结合Canvas组件的onReady()生命回调周期实现,加载动画时机需放置在onReady()生命周期回调内或及之后。

  • 同一Canvas组件加载多次/不同动画资源,需要手动销毁动画(lottie.destroy()/animationItem.destroy()),之后才可再次加载其他动画资源。

    this.animationItem?.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
            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]                      // 播放的动画片段
          })
  • 加载动画时,path 参数和 animationData 参数,二者选其一。
  • path 参数:只支持加载entry/src/main/ets 文件夹下的相对路径,不支持跨包查找文件。
  • animationData 参数:可结合ResourceManager进行读取资源文件内容进行设置。
  • 加载外部资源图片:应用默认读取沙箱路径下的图片,如果沙箱下没有对应的资源图片,则会继续读取rawfile下的对应资源图片

6.HSP场景

  • 为了适配HSP场景,loadAnimation接口新增当前场景上下文context可选参数传入,在HSP场景下需要传正确的context,非HSP场景不影响,context可以不传
    let contexts = getContext(this).createModuleContext('library') as common.UIAbilityContext;
    lottie.loadAnimation({
            container: this.mainCanvasRenderingContext,  // 渲染上下文
            renderer: 'canvas',                          // 渲染方式
            loop: true,                                  // 是否循环播放,默认true
            autoplay: true,                              // 是否自动播放,默认true
            animationData: this.jsonData,                // json对象数据
            context: contexts,                           // 当前场景上下文context
            contentMode: 'Contain',                      // 填充的模式
            initialSegment: [10,50]                      // 播放的动画片段
          })
  • 在HSP场景下,lottie加载动画json资源文件需通过animationData方式加载,需把动画json资源文件放在rawfile下进行读取加载:
  • 加载动画时,animationData 参数。
  • animationData 参数:可结合ResourceManager进行读取资源文件内容进行设置。
    let resStr = new util.TextDecoder('utf-8',{ignoreBOM: true});
    let context = getContext(this).createModuleContext('library') as common.UIAbilityContext
    context.resourceManager.getRawFile('grunt.json',(err: Error,data: Uint8Array) =>{
      if(data === null || data === undefined || data.buffer=== undefined){
        return;
      }
      let lottieStr = resStr.decode(new Uint8Array(data.buffer));
      this.jsonData = JSON.parse(lottieStr);
    })

7.控制动画

  • 播放动画

    lottie.play() //所有动画播放
    或
    animationItem.play() //当前指定animationItem动画播放
    
  • 停止动画

    lottie.stop() //所有动画停止
    或
    animationItem.stop() //当前指定animationItem动画停止
    
  • 暂停动画

    lottie.pause() //所有动画暂停
    或
    animationItem.pause() //当前指定animationItem动画暂停
    
  • 切换暂停/播放

    lottie.togglePause() //所有动画切换暂停/播放
    或
    animationItem.togglePause() //当前指定animationItem动画切换暂停/播放
    
  • 设置播放速度

    注意:speed>0正向播放, speed<0反向播放, speed=0暂停播放, speed=1.0/-1.0正常速度播放

    lottie.setSpeed(1) //所有动画设置播放速度
    或
    animationItem.setSpeed(1) //当前指定animationItem动画设置播放速度
    
  • 设置动画播放方向

    注意:direction 1为正向,-1为反向

    lottie.setDirection(1) //所有动画设置播放方向
    或
    animationItem.setDirection(1) //当前指定animationItem动画设置播放方向
    
  • 销毁动画

    注意:页面不显示或退出页面时,需要销毁动画; 可配合页面生命周期aboutToDisappear()及onPageHide(),或者Canvas组件的onDisAppear()使用

    lottie.destroy() //所有动画播放
    或
    animationItem.destroy() //当前指定animationItem动画播放
    
  • 控制动画停止在某一帧或某一时刻

    注意:根据第二个参数判断按帧还是按毫秒控制,true 按帧控制,false 按时间控制,缺省默认为false

    animationItem.goToAndStop(250,true)
    或
    animationItem.goToAndStop(5000,false)
    
  • 控制动画从某一帧或某一时刻开始播放

    注意:根据第二参数判断按帧还是按毫秒控制,true 按帧控制,false 按时间控制,缺省默认为false

    animationItem.goToAndPlay(250,true)
    或
    animationItem.goToAndPlay(12000,false)
    
  • 限定动画资源播放时的整体帧范围,即设置动画片段

    animationItem.setSegment(5,15);
    
  • 播放动画片段

    注意:第二参数值为true立刻生效, 值为false循环下次播放的时候生效

    animationItem.playSegments([5,15],[20,30],true)
    
  • 重置动画播放片段,使动画从起始帧开始播放完整动画

    注意:参数值为true立刻生效, 值为false循环下次播放的时候生效

    animationItem.resetSegments(5,15);
    
  • 获取动画时长/帧数

    注意:参数值为true时获取帧数,值为false时获取时间(单位ms)

    animationItem.getDuration();
    
  • 添加侦听事件

    注意:添加和移除的事件监听,回调函数需是同一个,需预先定义,否则将不能正确移除

    AnimationEventName = 'enterFrame' | 'loopComplete' | 'complete' | 'segmentStart' | 'destroy' | 'config_ready' | 'data_ready' | 'DOMLoaded' | 'error' | 'data_failed' | 'loaded_images';
    
    animationItem.addEventListener("enterFrame",function(){
        // TODO something
    })
    
  • 更改动画渲染颜色

    注意:第一个参数颜色是RGB值,第二个参数是动画的层次 可不填,第三个参数是对应动画层次的元素的下标值 可不填

    animateItem.changeColor([255,150,203])  //修改整个动画的颜色
    或
    animateItem.changeColor([255,150,203],2) //修改该动画第二层的颜色
    或
    animateItem.changeColor([255,150,203],2,2) //修改该动画第二层第二个元素的颜色
    
  • 移除侦听事件

    animationItem.removeEventListener("enterFrame",function(){
        // TODO something
    })
    
  • 刷新动画布局

    animationItem.resize()
    
  • 动画填充模式

    注意:动画填充模式共有5种:Fill,Cover,Top,Bottom,Contain,其中默认的填充模式是:Contain

    animateItem.setContentMode('Cover');
    
    
  • 设置动画的刷帧率

    注意:设置动画animator的刷帧率,范围是1~120

    animateItem.setFrameRate(30);
    
    
  • lottie销毁动画支持以下两种方式:

  1. lottie.destroy:销毁所有动画播放,lottie.destroy(name)销毁指定name的动画。
  2. animateItem.destroy:销毁指定animateItem的动画播放。

注意:当同一个页面中存在多个动画,且动画实例赋值给同一个变量animateItem时,使用animateItem.destroy销毁动画时,只会销毁最后一个。如:

    this.animationItem = lottie.loadAnimation({
          container: this.mainCanvasRenderingContext,  // 渲染上下文
          renderer: 'canvas',                          // 渲染方式
          loop: true,                                  // 是否循环播放,默认true
          autoplay: true,                              // 是否自动播放,默认true
          name: 'cat',                                // 动画名称
          contentMode: 'Contain',                      // 填充的模式
          path: this.path,                             // json路径
          initialSegment: [10,50]                      // 播放的动画片段
        })
        
    this.animationItem = lottie.loadAnimation({
          container: this.mainCanvasRenderingContext,  // 渲染上下文
          renderer: 'canvas',                          // 渲染方式
          loop: true,                                  // 是否循环播放,默认true
          autoplay: true,                              // 是否自动播放,默认true
          name: '2016',                                // 动画名称
          contentMode: 'Contain',                      // 填充的模式
          path: this.path,                             // json路径
          initialSegment: [10,50]                      // 播放的动画片段
        })        

执行this.animationItem.destroy(),只会销毁name为2016的动画,name为cat的动画不会被销毁。建议:动画销毁时,使用lottie.destroy方式进行销毁。

接口说明

使用方法类型相关描述
play()name?播放
stop()name?停止
pause()name?暂停
togglePause()name?切换暂停
destroy()name?销毁动画
goToAndStop()value, isFrame?, name?跳到某一时刻并停止
goToAndPlay()value, isFrame?, name?跳到某一时刻并播放
setSegment()init,end设置动画片段
playSegments()arr, forceFlag播放指定片段
resetSegments()forceFlag重置动画
setSpeed()speed设置播放速度
setDirection()direction设置播放方向
getDuration()isFrames?获取动画时长
addEventListener()eventName,callback添加监听状态
removeEventListener()name,callback?移除监听状态
changeColor()color, layer?, index?更改动画颜色
setContentMode()contentMode设置填充模式
setFrameRate()frameRate设置动画刷帧率

新增特性

  1. 支持canvas渲染模式下动画的颜色修改
  • 支持设置RGG格式颜色
  • 支持设置RGBA格式颜色
  • 支持设置起始关键帧颜色
  1. 支持canvas渲染模式下动画的masks/mattes部分特性
  • masks模式支持 mode = a, mode = s, mode = f 模式
  • mattes模式支持 tt = 1, tt = 2 模式
  1. 支持canvas渲染模式下动画的高斯模糊效果

  2. 支持canvas渲染模式下加载外部资源图片

  • 支持加载沙箱路径的外部资源图片(优先查找的路径)
  • 支持加载rawfile目录下的外部资源图片
  1. 支持设置填充模式
  • Fill 填充拉伸(可能被拉伸、不会被裁剪)
  • Top 等比填充-顶对齐(不会被裁剪、长边对齐)
  • Bottom 等比填充-底对齐(不会被裁剪、长边对齐)
  • Cover 等比缩放填充(可能被裁剪、断边对齐)
  • Contain 等比填充-纵向中对齐(不会被裁剪、长边对齐)
  1. 支持设置动画animator的刷帧率

约束与限制

在下述版本验证通过:

  • DevEco Studio: NEXT Developer Beta1(5.0.3.122), SDK: API12(5.0.0.18)

目录结构

/lottie        # 项目根目录
├── entry      # 示例代码文件夹
├── lottie     # lottie库文件夹
│    └─ src/main/js
│       └─ build/player 
│          └─ lottie.js # 核心代码,包含json解析,动画绘制,操作动画
│       └─index.d.ts    # 接口声明文档                     
├── README.md  # 安装使用方法                    

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1606514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器视觉【1】-机械臂视觉

文章目录 Eye-to-HandEye-in-Hand基于Eye-in-Hand型机械臂单目视觉定位单目相机标定针孔相机模型畸变标定方法机械臂手眼标定手眼标定求解图像预处理图像灰度化与二值化图像滤波图像特征匹配机械臂单目视觉定位目标物体图像深度信息目标物体中心定位参考文献根据机械臂与相机所…

python来实现nmap扫描

今天分享一个用python实现nmap扫描的方法&#xff0c;以下是实现步骤 代码如下&#xff1a; import subprocessmissing_ips {166.139.144.163, 31.47.8.35, 58.242.86.191, 212.178.135.62, 103.1.35.114} port "7" for missing_ip in missing_ips:# 构造nmap命令…

数学建模--蒙特卡罗法MATLAB代码保姆式解析

1.简单介绍 2.思想的实际运用 我们利用蒙特卡罗法的思想求解圆周率π的值&#xff0c;这里求得的肯定是近似值&#xff0c;我们是通过大量的模拟实验&#xff0c;利用概率求解的&#xff0c;但是这个值和我们的精确值之间还是有一定的误差的&#xff1b; 我们的思想就是在半径为…

智慧化赋能园区新未来:探讨智慧园区如何以科技创新为引擎,推动产业转型升级

随着科技的飞速发展&#xff0c;智慧化已成为推动园区产业升级和转型的重要引擎。智慧园区&#xff0c;以其高效、便捷、智能的特性&#xff0c;正逐步改变传统的产业园区模式&#xff0c;为产业发展注入新的活力。本文旨在探讨智慧园区如何以科技创新为引擎&#xff0c;推动产…

web自动化系列-selenium的3种等待方式(十一)

在ui自动化测试中&#xff0c;几乎出现问题最多的情况就是定位不到元素 &#xff0c;当你的自动化在运行过程中 &#xff0c;突然发现报错走不下去了 。很大概率就是因为找不到元素 &#xff0c;而找不到元素的一个主要原因就是页面加载慢 &#xff0c;代码运行速度快导致 。 …

vivado 使用 JTAG-to-AXI Master 调试核进行硬件系统通信

使用 JTAG-to-AXI Master 调试核进行硬件系统通信 JTAG-to-AXI Master 调试核为可自定义核 &#xff0c; 可在运行时生成 AXI 传输事务并驱动 FPGA 内部的 AXI 信号。该核支持所 有存储器映射型 AXI 接口和 AXI4-Lite 接口 &#xff0c; 并且可支持位宽为 32 或 64 …

Ubuntu 传输文件

scp [选项] 源文件 目标路径 以下是一些常用的 scp 命令选项&#xff1a; -r&#xff1a;递归复制目录和子目录。 -P&#xff1a;指定远程 SSH 服务器的端口号。 -i&#xff1a;指定用于身份验证的私钥文件。 -p&#xff1a;保留源文件的时间戳、权限和所有者。 -v&#x…

嵌入式面试-回答I2C

说明&#xff1a; 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理&#xff0c;主要针对的是嵌入式软件面试中涉及到的问答&#xff0c;努力精准的抓住重点进行描述。若有不足非常欢迎指出&#xff0c;感谢&#xff01;在总结过程中有些答案没标记参考来源&…

线性代数---行列式的性质

1. 行列式的行与列(按原顺序)互换

RabbitMQ学习记录

核心概念 Brocker&#xff1a;消息队列服务器实体 Exchange(消息交换机)&#xff1a;它指定消息按什么规则&#xff0c;路由到哪个队列。 Queue(消息队列载体)&#xff1a;每个消息都会被投入到一个或多个队列。 Binding(绑定)&#xff1a;它的作用就是把exchange和queue按…

心学从0开始学习rust-十万个为什么篇章(持续更新篇章)

问答环节 1.const x 1;和let x 1有何区别呢&#xff0c;const申请的是全局变量所以会一直有效对吗&#xff1f; const 声明的常量具有全局作用域&#xff0c;但它们不能直接在函数内部声明。常量通常用于定义整个程序中使用的值&#xff0c;如配置常量或数学常量。 let 声明…

并发执行一定比串行执行快吗?

一、多线程的两个主要方向 并发:多线程之间各自执行各自的互不影响 并行:多线程之间互相竞争资源&#xff0c;进行读写的时候可能会产生相互覆盖 二、上下文切换 1.什么是上下文切换 在多线程编程中一般线程的个数都大于cpu的核心数,而一个cpu核心在任意时刻都只能被一个线…

ElasticSearch实战之项目搜索高亮

文章目录 1. 前情配置2、数据操作2.1 操作API2.2 数据入库 3. 高亮搜索3.1 方法封装3.2 高亮搜索 1. 前情配置 为满足ElasticSearch可在项目中实现搜索高亮&#xff0c;我们需要先做一些前情配置 导入ElasticSearch依赖 <dependency><groupId>org.springframewor…

怎么设置启用远程桌面? 如何让外网电脑远程本地内网?

如何远程控制电脑&#xff1f;最简单实用的方案是开启电脑系统自带的远程桌面功能&#xff0c;如果涉及跨网、内外网互通&#xff0c;可以同时用快解析内网映射外网。下面是方案的具体实施步骤&#xff0c;供大家参考。 怎么打开设置启用远程桌面&#xff1f; 1.在目标需要远…

【详细讲解CentOS常用的命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

android 创建module

文章目的&#xff1a; 快速创建module并使用 创建步骤&#xff1a; 1 创建module 2 修改module下的build.gradle文件 3 修改清单文件中MainActivity属性&#xff0c;否则APP会因为有多个启动界面而崩溃 4 在主项目build.gradle引用该object Module 至此&#xff0c;可在APP中…

排序(五)——非比较排序+排序总结

1.非比较排序 我们前面讲的排序算法都是通过比较大小来进行排序的&#xff0c;他们都是比较排序。 像基数排序、计数排序和桶排序等都不是通过比较大小来排序的&#xff0c;是非比较排序&#xff0c;在这里我们讲一下其中的计数排序和基数排序&#xff0c;而桶排序实现起来太…

在k8s 中部署有状态服务MongoDB高可用集群详解(附带镜像)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s简介 2、MongoDB介绍 3、为什么要…

网络爬虫软件学习

1 什么是爬虫软件 爬虫软件&#xff0c;也称为网络爬虫或网络蜘蛛&#xff0c;是一种自动抓取万维网信息的程序或脚本。它基于一定的规则&#xff0c;自动地访问网页并抓取需要的信息。爬虫软件可以应用于大规模数据采集和分析&#xff0c;广泛应用于舆情监测、品牌竞争分析、…

【 书生·浦语大模型实战营】作业(五):LMDeploy 量化部署

【 书生浦语大模型实战营】作业&#xff08;五&#xff09;&#xff1a;LMDeploy 量化部署 &#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系…