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

embedded/2025/3/5 4:07:47/

一、背景

在开发过程中,我们可能会遇到需要控制 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 动图播放一次的核心代码:

import { image } from '@kit.ImageKit';@Entry
@Component
struct ImageAnimatorExample {@State state: AnimationStatus = AnimationStatus.Initial; // 控制动画状态imageFrames: Array<ImageFrameInfo> = []; // 存储解析后的帧信息isSelected: boolean = false; // 控制点击状态async aboutToAppear() {// 解析 WebP 动图,获取帧信息this.imageFrames = await this.getImageFrameInfoFromMedia($r('app.media.duck'));}build() {Column({ space: 10 }) {// ImageAnimator 组件ImageAnimator().images(this.imageFrames) // 设置帧信息.state(this.state) // 设置动画状态.iterations(1) // 设置播放次数为 1.width(400).height(400).margin({ top: 100 }).onClick(() => {// 点击图片,开始播放动画this.isSelected = true;this.state = AnimationStatus.Running;});// 重置按钮Button('Reset').onClick(() => {// 点击按钮,停止动画并重置状态this.isSelected = false;this.state = AnimationStatus.Stopped;});}.width('100%').height('100%');}// 解析 WebP 动图,获取帧信息private async getImageFrameInfoFromMedia(resource: Resource) {// 获取 WebP 文件的二进制数据let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({bundleName: resource.bundleName,moduleName: resource.moduleName,id: resource.id,});// 创建 ImageSource 对象let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength));// 获取所有帧的 PixelMaplet createPixelMap: Array<image.PixelMap> = await imageSource.createPixelMapList({desiredPixelFormat: image.PixelMapFormat.RGBA_8888,});// 获取每帧的延迟时间let delayList = await imageSource.getDelayTimeList();await imageSource.release();// 构建帧信息数组let imageFrameInfoArray: Array<ImageFrameInfo> = [];for (let i = 0; i < createPixelMap.length; i++) {imageFrameInfoArray.push({src: createPixelMap[i],duration: delayList[i],});}return imageFrameInfoArray;}
}

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 安装:

ohpm i @ohos/imageknife

4.3 示例代码

以下是使用 ImageKnife 实现 WebP 动图播放的核心代码:

import { AnimatorOption, ImageKnifeAnimatorComponent } from '@ohos/imageknife';@Entry
@Component
struct ImageAnimatorExample {@State animatorOption: AnimatorOption = {state: AnimationStatus.Running, // 动画状态iterations: 3, // 播放次数};build() {Column() {// ImageKnifeAnimatorComponent 组件ImageKnifeAnimatorComponent({imageKnifeOption: {loadSrc: $r('app.media.duck'), // 加载 WebP 动图},animatorOption: this.animatorOption, // 设置动画选项}).width(300).height(300).backgroundColor(Color.Orange).margin({ top: 30 });}.width('100%').height('100%');}
}

4.4 实现效果

  • 动图自动开始播放,控制播放3次。

  • 通过 animatorOption 可以灵活控制播放次数和状态。

图1

🚀🚀🚀  踩坑不易,还希望各位大佬支持一下

📃 鸿蒙土拨鼠充电开源项目:

✍GitHub开源项目地址👉:https://github.com/cheinlu/groundhog-charging-system

📃 鸿蒙土拨鼠大理石开源项目

✍GitHub开源项目地址👉:https://github.com/cheinlu/HarmonyOS-groundhog-marble-system

最后:👏👏😊😊😊👍👍  


http://www.ppmy.cn/embedded/170079.html

相关文章

【终篇】基于C++的通讯录管理系统(完整源码)

前置 安装 nlohmann/json 库 文件结构 AddressBook/ ├── nlohmann└── json.hpp ├── Contact.h ├── Contact.cpp ├── AddressBook.h ├── AddressBook.cpp ├── Serializer.h ├── Serializer.cpp ├── FileManager.h ├── FileManager.cpp └── …

深度求索(DeepSeek)的AI革命:NLP、CV与智能应用的技术跃迁

Deepseek官网&#xff1a;DeepSeek 引言&#xff1a;AI技术浪潮中的深度求索 近年来&#xff0c;人工智能技术以指数级速度重塑全球产业格局。在这场技术革命中&#xff0c;深度求索&#xff08;DeepSeek&#xff09;凭借其前沿的算法研究、高效的工程化能力以及对垂直场景的…

PySpark中mapPartitionsWithIndex等map类算子生成器函数问题 - return\yield

PySpark中mapPartitionsWithIndex等map类算子生成器函数问题 - return\yield 顾名思义&#xff0c;本文讲述了map算子生成器函数的相关问题——return 和 yield的使用。 首先先讲结论&#xff0c;在使用map等迭代生成的算子时最好使用yield。 1、问题产生 在写代码的过程中&…

我们应该如何优化UI(基于UGUI)

这是一道面试题&#xff0c;下面&#xff0c;我们来详细分析这个问题。 目录 1. 减少 Draw Call 合理设置图集 避免材质和 Shader 的频繁切换 减少 UI 元素的重叠 2. 优化UI布局 3. 优化UI元素的渲染 4.优化UI动画 5. 优化 UI 事件处理 6. 运行时优化 1. 减少 Draw C…

初阶数据结构(C语言实现)——3顺序表和链表(1)

目录 【本节目标】1. 线性表2.顺序表2.1概念及结构2.2 接口实现2.2.0 动态顺序表2.2.1 顺序表初始化SLInit&#xff08;&#xff09;2.2.2 销毁和打印2.2.3 尾插SLPushBack&#xff08;&#xff09;2.2.4 尾删SLPopBack&#xff08;&#xff09;2.2.5 头插2.2.6 头删2.2.7 插入…

天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库

天佐.乾坤袋 天佐.乾坤袋 简介 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库&#xff0c;可用于文件打包&#xff0c;数据整合&#xff0c;加密存放等多种用途。可以方便快捷的搭建和部署存储应用的系统。 传说: 弥勒所有&#xff0c;专做储物之用。拥有不可思议之力&#x…

优云智算:借助强大镜像社区,开启AI算力新纪元!

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ 目录 前言&#xff1a; 平台介绍&#xff1a; …

利用Java爬虫获取1688店铺所有商品信息:实战指南

在电商领域&#xff0c;获取1688店铺的所有商品信息对于市场分析、选品决策和竞争情报收集至关重要。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品数据。通过Java爬虫技术&#xff0c;我们可以高效地获取1688店铺的所有商品信息。本文将详细介绍如何利用Java爬虫…