鸿蒙中如何实现lottie动画

hm688c71e20e810
发布于 2025-9-19 12:14
浏览
0收藏

官方文档:

​https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Flottie​

相关文档​​https://developer.huawei.com/consumer/cn/doc/architecture-guides/news-v1_2-ts_19-0000002298448729​

参考文档:​​OpenHarmony三方库中心仓​

import lottie, { AnimationItem } from '@ohos/lottie';

@Entry
@Component
struct Index {
  // 构建上下文
  private renderingSettings: RenderingContextSettings = new RenderingContextSettings(true);
  private canvasRenderingContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.renderingSettings);
  private animateItem: AnimationItem | null = null;
  private animateName: string = 'animation'; 

  // 页面销毁时释放动画资源
  aboutToDisappear(): void {
    console.info('aboutToDisappear');
    lottie.destroy();
  }

  build() {
    Row() {
      // 关联画布
      Canvas(this.canvasRenderingContext)
        .width(200)
        .height(200)
        .backgroundColor(Color.Gray)
        .onReady(() => {
          // 加载动画
          if (this.animateItem != null) {
            // 可在此生命回调周期中加载动画,可以保证动画尺寸正确
            this.animateItem?.resize();
          } else {
            // 抗锯齿的设置
            this.canvasRenderingContext.imageSmoothingEnabled = true;
            this.canvasRenderingContext.imageSmoothingQuality = 'medium';
            this.loadAnimation();
          }
        })
    }
  }

  loadAnimation() {
    this.animateItem = lottie.loadAnimation({
      container: this.canvasRenderingContext,
      renderer: 'canvas', // canvas 渲染模式
      loop: true,
      autoplay: false,
      name: this.animateName,
      contentMode: 'Contain',
      path: 'common/animation.json',
    })
    // 因为动画是异步加载,所以对animateItem的操作需要放在动画加载完成回调里操作
    this.animateItem.addEventListener('DOMLoaded', (args: Object): void => {
      this.animateItem.changeColor([225, 25, 100, 1]);
      this.animateItem.play();
    });
  }

  destroy() {
    this.animateItem.removeEventListener('DOMLoaded');
    lottie.destroy(this.animateName);
    this.animateItem = null;
  }
}

Demo:

import lottie, { AnimationItem } from "@ohos/lottie";

@Preview
@Component
export struct LottieView {
  name = "sleeping_2"
  private animateItem: AnimationItem | null = null;
  private renderingSettings: RenderingContextSettings = new RenderingContextSettings(true)
  private canvasRenderingContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.renderingSettings)
  private animateItem2: AnimationItem | null = null;

  aboutToAppear(): void {
    console.info('aboutToAppear');

    lottie.destroy('aboutToAppear')
    this.animateItem2 = lottie.loadAnimation({
      container: this.canvasRenderingContext,
      renderer: 'canvas', // canvas 渲染模式
      loop: true,
      autoplay: true,
      name: this.name,
      contentMode: 'Contain',
      path: "pages/common/lottie/"+this.name+".json",
      // path: "common/lottie/data_rawfile.json"
      // path: "common/lottie/data_base64.json"
    })
  }

  build() {
    Column() {
      Stack() {
        Canvas(this.canvasRenderingContext)
          .width('100%')
          .height('100%')
          //.backgroundColor(Color.Gray)
          .onReady(() => {
            this.animateItem2?.resize();
          })
          .onDisAppear(() => {
            // 组件移除时,可销毁动画资源
            lottie.destroy(this.name);
          })
      }
    }
  }

}

标签
收藏
回复
举报
回复
    相关推荐