
回复
官方文档:
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);
})
}
}
}
}