更新记录
1.0.0(2026-07-17)
- 首个稳定版本。
- 支持 uni-app x Web、Android、iOS 和 HarmonyOS,以及 uni-app Vue 3 H5/Web。
- 支持本地路径、远程 URL 和平台绝对路径加载 PAG 动画。
- 支持自动播放、循环次数、画面适配、最大帧率、缓存和视频层配置。
- 提供播放、暂停、停止、进度跳转、状态查询和缓存清理方法。
- 提供
ready、error、start、end、cancel、repeat 事件及统一错误码。
- 支持通过唯一组件 ID 创建 Context,并支持同页多实例独立播放。
- 集成 libpag 原生依赖,并随插件提供 Web WASM 资源和第三方许可证声明。
平台兼容性
uni-app(5.15)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
- |
- |
√ |
- |
- |
- |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(5.15)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| √ |
√ |
√ |
√ |
√ |
- |
hans-pag
hans-pag 是基于 libpag 的 PAG 动画播放组件,支持本地和远程 .pag 文件、播放控制、进度跳转、循环和多实例播放。
平台兼容
| 项目类型 |
Web |
Android |
iOS |
HarmonyOS |
| uni-app x |
支持 |
支持 |
支持 |
支持 |
| uni-app Vue 3 |
支持 |
不支持 |
不支持 |
不支持 |
- HBuilderX 4.61+
- Android API 21+,支持
armeabi-v7a、arm64-v8a、x86_64
- iOS 12.0+
- HarmonyOS NEXT API 15+,仅支持
arm64-v8a
- Web 建议 Chrome 69+ 或 Safari 15+
安装
将插件导入项目,确认目录为 uni_modules/hans-pag。Android、iOS 和 HarmonyOS 使用原生依赖;调试 App 时如标准基座不包含依赖,请制作自定义调试基座。
uni-app x 用法
<template>
<hans-pag
id="bannerPag"
class="pag"
src="/static/pag/banner.pag"
:autoplay="true"
:repeat-count="0"
scale-mode="letter-box"
@ready="onReady"
@error="onError"
/>
</template>
<script setup lang="uts">
import { createHansPagContext } from "@/uni_modules/hans-pag"
function onReady(e: UTSJSONObject) {
console.log("duration", e.getNumber("durationMs", 0))
}
function onError(e: UTSJSONObject) {
console.error(e.getString("code", ""), e.getString("message", ""))
}
function pauseBanner() {
createHansPagContext("bannerPag")?.pause()
}
</script>
<style>
.pag {
width: 300px;
height: 300px;
}
</style>
uni-app Vue 3 Web 用法
<template>
<hans-pag ref="pagRef" class="pag" src="/static/pag/banner.pag" @error="onError" />
</template>
<script setup>
import { ref } from 'vue'
const pagRef = ref(null)
function onError(e) {
console.error(e.code, e.message)
}
function pauseBanner() {
pagRef.value?.pause()
}
</script>
Props
| 属性 |
类型 |
默认值 |
说明 |
id |
string |
自动生成 |
使用 createHansPagContext 时必须设置唯一 ID |
src |
string |
"" |
/static/...、远程 URL 或平台绝对路径 |
autoplay |
boolean |
true |
加载完成后自动播放 |
repeatCount |
number |
1 |
总播放次数,0 表示无限循环 |
scaleMode |
string |
"letter-box" |
none、stretch、letter-box、zoom |
maxFrameRate |
number |
60 |
最大帧率,范围会归一化到 1~120 |
cacheEnabled |
boolean |
true |
是否启用图形缓存 |
videoEnabled |
boolean |
true |
是否渲染视频合成层 |
webFirstFrame |
boolean |
true |
仅 Web,是否初始化首帧 |
事件
uni-app x 事件参数为 UTSJSONObject,uni-app Vue 3 Web 为普通对象。
| 事件 |
数据字段 |
ready |
src、durationMs、width、height |
error |
code、message、src、platform |
start |
type |
end |
type |
cancel |
type |
repeat |
type |
错误码包括 E_UNSUPPORTED_PLATFORM、E_NATIVE_DEP_MISSING、E_INIT_FAILED、E_INVALID_SRC、E_LOAD_FAILED、E_DECODE_FAILED、E_CANCELLED、E_WASM_LOAD_FAILED 和 E_RENDER_FAILED。
实例方法
uni-app x 使用 createHansPagContext(id) 获取实例;uni-app Vue 3 Web 使用组件 ref。两者提供相同方法:
| 方法 |
说明 |
play() |
播放或继续播放 |
pause() |
暂停播放 |
stop() |
停止并回到进度 0 |
isPlaying() |
返回是否正在播放 |
setProgress(progress) |
跳转进度,范围 0~1 |
getProgress() |
获取当前进度 |
getDurationMs() |
获取时长,单位毫秒 |
setRepeatCount(count) |
设置总播放次数 |
setScaleMode(mode) |
设置画面适配方式 |
freeCache() |
清理当前播放器缓存 |
使用注意
- 多实例使用时必须设置不同的
id,并在页面卸载后避免继续持有旧 Context。
- Web 加载远程 PAG 时,资源服务器必须允许跨域访问。
- Web 使用单线程 WASM;大量同屏实例可能受浏览器 WebGL context 数量和设备性能限制。
- 普通 uni-app Vue 3 仅支持 H5/Web;Android、iOS、HarmonyOS 原生播放请使用 uni-app x。
- 1.0.0 仅提供播放能力,不支持文字/图片替换、截图或图层查询。
隐私与许可证
组件自身不采集个人信息。src 为远程地址时,网络请求由宿主应用指定并负责合规。libpag 采用 Apache-2.0 许可证,相关许可证和第三方声明位于 LICENSES/。