Skip to content

Lottie 动画

Lottie (opens new window)是一款能够为应用添加精美动画的开源组件,它可以解析 AE(After Effects) 导出的 json 文件,然后基于 Canvas 画布进行 2D 渲染,并结合原生组件 Animator 实现动画效果,让复杂的动画资源轻松运行在应用程序中。本节笔者简单介绍一下 Lottie 的使用。

Lottie 安装

Lottie 是一个独立的三方开源库,使用之前需要在本地安装。打开 Dev Eco Studio ,点击工具栏的 Terminal 终端,进入 entry 目录下,依次输入如下命令

bash

npm config set @ohos:registry=https://repo.harmonyos.com/npm/
npm install @ohos/lottieETS

Terminal 终端输出如下内容:

图片

然后在 entry 目录下的 node_modules 下会有下载的 lottieETS 库并且 package.json 也会自动引入对 Lottie 的依赖,截图如下所示:

图片

Lottie 使用

引入 Lottie 模块

bash

import lottie from '@ohos/lottieETS'

使用 Lottie 动画

Lottie 动画效果是在 Canvas 上自绘制实现的,所以使用 Lottie 前,需要创建一个 Canvas 然后把 Canvas 的 Context 绑定到 Lottie 上。

简单样例如下所示:

bash

import lottie from '@ohos/lottieETS'

@Entry @Component struct LottieTest {

  private setting: RenderingContextSettings = new RenderingContextSettings(true);
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.setting);

  private lottiePath: string = "pages/navidad.json";
  private lottieName: string = "lottie_data";

  @State playState: string = "";

  build() {
    Column({space: 10}) {
      Canvas(this.context)
        .width("50%")
        .height("20%")
        .backgroundColor("#aabbcc")
        .onDisAppear(() => {
          lottie.destroy(this.lottieName) // Canvas销毁时顺带销毁lottie动画
        })

      // API 9之后不需要该配置
      // Animator("__lottie_ets")            // 提前声明Animator('__lottie_ets')对象

      Text(this.playState)
        .fontSize(22)

      Row({space: 5}) {
        Button('开启')
          .onClick(() => {
          	// 加载动画并自动播放
            lottie.loadAnimation({
              container: this.context,    // 需要绑定Canvas的CanvasRenderingContext2D
              renderer: "canvas",         // 目前只支持canvas模式
              loop: true,                 // 是否循环播放
              autoplay: true,             // 是否自动播放
              name: this.lottieName,      // 设置lottie动画名称
              path: this.lottiePath       // 指定lottie动画资源路径
            })
            this.playState = "已开启";
          })
        Button('暂停')
          .onClick(() => {
            lottie.pause(this.lottieName) // 暂停lottie动画
            this.playState = "已暂停";
          })
        Button('恢复')
          .onClick(() => {
            lottie.play(this.lottieName)  // 播放lottie动画
            this.playState = "已恢复";
          })
        Button('停止')
          .onClick(() => {
            lottie.stop(this.lottieName)  // 停止lottie动画
            this.playState = "已停止";
          })
        Button('销毁')
          .onClick(() => {
            lottie.destroy(this.lottieName)// 销毁lottie动画,回收资源
            this.playState = "已销毁";
          })
      }
    }
    .width('100%')
    .height('100%')
    .padding(10)
  }
}

样例运行结果如下图所示:

图片

销毁 Lottie 动画

Lottie 提供了 destroy() 方法进行资源销毁,一般是在 CanvasonDisAppear() 方法或者是在 page 的 aboutToDisappear() 方法调用。

Lottie 事件处理

Lottie 提供了对动画解析以及动画播放相关的事件回调,当我们调用 loadAnimation() 方法时 Lottie 返回一个 AnimationItem 动画实例,该实例除了提供了获取动画相关状态外(比如动画是否已经加载,当前播放的帧数等等)还提供了 addEventListener() 和 removeEventListener() 方法用来添加和删除各种事件类型的回调操作。

简单样例如下所示:

bash

Button('开启')
  .onClick(() => {
    this.lottieAnimation = lottie.loadAnimation({
      container: this.context,
      renderer: "canvas",
      loop: true,
      autoplay: true,
      name: this.lottieName,
      path: this.lottiePath
    })
    // 添加对error的事件回调
    this.lottieAnimation.addEventListener("error", () => {
      console.log("lottie error")
    })
    // 添加对complete的事件回调
    this.lottieAnimation.addEventListener("complete", () => {
      console.log("lottie finish")
    })
    this.playState = "已开启";
  })

Lottie 在 AnimationEventName 中定义了以下 11 种事件类型可供监听:

bash

export type AnimationEventName = 'enterFrame' | 'loopComplete' | 'complete' | 'segmentStart' | 'destroy' | 'config_ready' | 'data_ready' | 'DOMLoaded' | 'error' | 'data_failed' | 'loaded_images';