【HarmonyOS NEXT】控制 WebP 格式动图播放次数的实现方案

[复制链接]
发表于 2025-10-10 04:36:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、配景

在开发过程中,我们大概会碰到必要控制 WebP 格式动态图播放次数的需求。比方,某些场景下只必要动图播放一次,而不是循环播放。然而,使用原生组件(如 Image 或 ImageAnimator)时,WebP 动图会被当作寻常图片处理处罚,无法直接控制播放次数。本文将先容两种办理方案:使用官方原生 API ImageAnimator 组件和使用第三方插件 ImageKnife。
二、实现方式

2.1 使用官方原生 API - ImageAnimator 组件
2.2 使用第三方插件 - ImageKnife
三、使用 ImageAnimator 组件实现

官方文档指引👉:文档中心
3.1 办理思绪

ImageAnimator 组件默认将 WebP 动图作为寻常图片处理处罚,无法直接控制播放次数。为了实现播放次数的控制,我们必要将 WebP 动图分析为多帧图片,然后将这些帧作为 ImageAnimator 的输入,从而实现对播放次数的准确控制。
3.2 示例代码

以下是使用 ImageAnimator 组件实现 WebP 动图播放一次的核心代码:
  1. import { image } from '@kit.ImageKit';
  2. @Entry
  3. @Component
  4. struct ImageAnimatorExample {
  5.   @State state: AnimationStatus = AnimationStatus.Initial; // 控制动画状态
  6.   imageFrames: Array<ImageFrameInfo> = []; // 存储解析后的帧信息
  7.   isSelected: boolean = false; // 控制点击状态
  8.   async aboutToAppear() {
  9.     // 解析 WebP 动图,获取帧信息
  10.     this.imageFrames = await this.getImageFrameInfoFromMedia($r('app.media.duck'));
  11.   }
  12.   build() {
  13.     Column({ space: 10 }) {
  14.       // ImageAnimator 组件
  15.       ImageAnimator()
  16.         .images(this.imageFrames) // 设置帧信息
  17.         .state(this.state) // 设置动画状态
  18.         .iterations(1) // 设置播放次数为 1
  19.         .width(400)
  20.         .height(400)
  21.         .margin({ top: 100 })
  22.         .onClick(() => {
  23.           // 点击图片,开始播放动画
  24.           this.isSelected = true;
  25.           this.state = AnimationStatus.Running;
  26.         });
  27.       // 重置按钮
  28.       Button('Reset')
  29.         .onClick(() => {
  30.           // 点击按钮,停止动画并重置状态
  31.           this.isSelected = false;
  32.           this.state = AnimationStatus.Stopped;
  33.         });
  34.     }
  35.     .width('100%')
  36.     .height('100%');
  37.   }
  38.   // 解析 WebP 动图,获取帧信息
  39.   private async getImageFrameInfoFromMedia(resource: Resource) {
  40.     // 获取 WebP 文件的二进制数据
  41.     let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({
  42.       bundleName: resource.bundleName,
  43.       moduleName: resource.moduleName,
  44.       id: resource.id,
  45.     });
  46.     // 创建 ImageSource 对象
  47.     let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength));
  48.     // 获取所有帧的 PixelMap
  49.     let createPixelMap: Array<image.PixelMap> = await imageSource.createPixelMapList({
  50.       desiredPixelFormat: image.PixelMapFormat.RGBA_8888,
  51.     });
  52.     // 获取每帧的延迟时间
  53.     let delayList = await imageSource.getDelayTimeList();
  54.     await imageSource.release();
  55.     // 构建帧信息数组
  56.     let imageFrameInfoArray: Array<ImageFrameInfo> = [];
  57.     for (let i = 0; i < createPixelMap.length; i++) {
  58.       imageFrameInfoArray.push({
  59.         src: createPixelMap[i],
  60.         duration: delayList[i],
  61.       });
  62.     }
  63.     return imageFrameInfoArray;
  64.   }
  65. }
复制代码
3.3 实现效果



  • 点击“Reset”按钮后,动画克制并重置状态展示图片。
  • 点击图片后,动图开始播放,且只播放一次。
   图2

四、使用第三方插件 ImageKnife

4.1 办理思绪

ImageKnife 是一个功能强盛的第三方插件,支持对动图的精致控制,包罗播放次数、播放状态等。通过 ImageKnife,我们可以更简朴地实现 WebP 动图的播放控制。
4.2 三方库先容及安装

4.2.1 简介:

这是专门为OpenHarmony打造的一款图像加载缓存库,致力于更高效、更轻巧、更简朴
entry/src/main/ets/pages/ImageAnimatorPage.ets · OpenHarmony-TPC/ImageKnife - Gitee.com
4.2.2 安装:

  1. ohpm i @ohos/imageknife
复制代码
4.3 示例代码

以下是使用 ImageKnife 实现 WebP 动图播放的核心代码:
  1. import { AnimatorOption, ImageKnifeAnimatorComponent } from '@ohos/imageknife';
  2. @Entry
  3. @Component
  4. struct ImageAnimatorExample {
  5.   @State animatorOption: AnimatorOption = {
  6.     state: AnimationStatus.Running, // 动画状态
  7.     iterations: 3, // 播放次数
  8.   };
  9.   build() {
  10.     Column() {
  11.       // ImageKnifeAnimatorComponent 组件
  12.       ImageKnifeAnimatorComponent({
  13.         imageKnifeOption: {
  14.           loadSrc: $r('app.media.duck'), // 加载 WebP 动图
  15.         },
  16.         animatorOption: this.animatorOption, // 设置动画选项
  17.       })
  18.         .width(300)
  19.         .height(300)
  20.         .backgroundColor(Color.Orange)
  21.         .margin({ top: 30 });
  22.     }
  23.     .width('100%')
  24.     .height('100%');
  25.   }
  26. }
复制代码
4.4 实现效果



  • 动图主动开始播放,控制播放3次。
  • 通过 animatorOption 可以机动控制播放次数和状态。
   图1
   🚀🚀🚀  踩坑不易,还渴望各位大佬支持一下
  📃 鸿蒙土拨鼠充电开源项目:
  ✍GitHub开源项目所在👉:https://github.com/cheinlu/groundhog-charging-system
  📃 鸿蒙土拨鼠大理石开源项目
  ✍GitHub开源项目所在👉:https://github.com/cheinlu/HarmonyOS-groundhog-marble-system
  末了:👏👏😊😊😊👍👍  
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表