更新记录
1.1.0(2026-08-14)
- 鸿蒙端改为 renderjs + libpag-web 方案(ArkWeb 中渲染),彻底解决原生库崩溃与 embed 空白问题
- 修复鸿蒙 file:// 环境 CORS:wasm 内联 base64(script 加载),.pag 逻辑层下载转 base64 传递
- 新增 width/height 属性:控制动画渲染分辨率(canvas 像素尺寸),动态修改实时生效
- 修复等比缩放:libpag web PAGScaleMode 为数字枚举(fit=2),scaleMode 真正生效
- 修复 H5 依赖加载:本地静态资源优先,CDN(jsdelivr/unpkg)多级兜底
- App 下载统一使用 uni.downloadFile,移除 iOS/Android 原生下载实现(消除 Swift/Kotlin 编译兼容问题)
- 小程序 wasm 内置插件(static/mp-weixin/),本地 .pag 素材自动兜底 .png 后缀
- 修复小程序 canvas node 被 Vue3 响应式代理导致 libpag 崩溃(原生对象移出 data)
平台兼容性
uni-app(5.23)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
- |
√ |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
sn-pag 腾讯 PAG 动画组件
基于腾讯 libpag 的跨平台 PAG 动画播放组件,支持 H5、微信小程序、App 安卓/iOS、App 鸿蒙。
平台支持
| 平台 |
渲染方式 |
说明 |
| H5 |
libpag web (wasm) + canvas |
Chrome 69+ / Safari 11.3+ |
| 微信小程序 |
libpag-miniprogram (wasm) + webgl canvas |
基础库 >= 2.9.0,需复制 wasm |
| App 安卓/iOS |
renderjs + libpag web (wasm) |
在 vue 页面 webview 中渲染 |
| App 鸿蒙 |
renderjs + libpag web (wasm) |
HBuilderX 4.23+,vue3(ArkWeb 中渲染) |
注意:App 端在普通 vue 页面通过 renderjs 运行 libpag web 版(wasm),非原生 PAGView 性能。如需原生性能,建议在 nvue/uvue 页面使用原生组件。
安装
- 将
uni_modules/sn-pag 目录复制到项目的 uni_modules/ 下。
- 安装 npm 依赖:
npm install libpag libpag-miniprogram
- 微信小程序:wasm 已随插件内置(
static/mp-weixin/),在微信开发者工具执行「工具 → 构建 npm」即可。本地 .pag 素材若读取失败(微信对 .pag 后缀限制),插件会自动尝试 .png 后缀,或将素材复制一份为 .png 后缀使用。
- App 端:使用 renderjs 方案,无需自定义基座;真机运行需配置网络下载权限(INTERNET 权限默认已有)。
基本用法
<template>
<view style="width: 300px; height: 300px;">
<sn-pag
ref="pag"
src="https://pag.qq.com/file/like.pag"
:autoPlay="true"
:repeatCount="-1"
scaleMode="fit"
:frameRate="60"
@init="onInit"
@load="onLoad"
@animationStart="onStart"
@animationEnd="onEnd"
@frame="onFrame"
@fail="onFail"
/>
</view>
</template>
<script>
export default {
methods: {
onInit() {
console.log("init");
},
onLoad(e) {
console.log("load", e);
},
onStart() {
console.log("start");
},
onEnd() {
console.log("end");
},
onFrame(e) {
console.log("progress", e.progress);
},
onFail(e) {
console.error("fail", e);
},
},
onUnload() {
this.$refs.pag && this.$refs.pag.destroy();
},
};
</script>
Props
| 属性 |
类型 |
默认值 |
说明 |
| src |
string |
'' |
PAG 文件路径,支持 http(s):// 网络地址与本地路径 |
| autoPlay |
boolean |
false |
加载完成后自动播放 |
| repeatCount |
number |
0 |
0=播放一次,-1=无限循环,正整数=重复 N 次 |
| scaleMode |
string |
'fit' |
none / fit / fill |
| frameRate |
number |
60 |
播放帧率上限 |
| width |
number | string |
'' |
动画渲染宽度(px):控制 canvas 像素分辨率与组件尺寸;不传则用 PAG 文件原始尺寸 |
| height |
number | string |
'' |
动画渲染高度(px):控制 canvas 像素分辨率与组件尺寸;不传则用 PAG 文件原始尺寸 |
Events
| 事件 |
参数 |
说明 |
| init |
— |
运行时初始化完成 |
| load |
{ width, height, duration } |
PAG 文件加载完成 |
| animationStart |
— |
动画开始 |
| animationEnd |
— |
动画结束 |
| animationRepeat |
— |
进入循环 |
| animationCancel |
— |
动画被中断 |
| frame |
{ progress } |
帧更新(0~1) |
| fail |
{ code, message } |
错误 |
Methods(通过 ref 调用)
| 方法 |
说明 |
| play() |
播放/继续 |
| pause() |
暂停 |
| stop() |
停止并回到第 0 帧 |
| setProgress(progress) |
跳转进度 0~1 |
| getProgress() |
获取当前进度 |
| isPlaying() |
是否播放中 |
| load(src) |
加载新文件 |
| setRepeatCount(count) |
设置循环次数 |
| destroy() |
释放资源 |
错误码
| code |
含义 |
| 1001 |
PAG 运行时初始化失败 |
| 1002 |
文件下载失败 |
| 1003 |
PAG 文件解析失败 |
| 1004 |
canvas 节点获取失败 |
| 1005 |
不支持的平台 |
| 1006 |
原生组件初始化失败(鸿蒙) |
注意事项
H5
- 网络 PAG 文件需服务端配置 CORS。
- wasm 文件需正确 MIME(application/wasm)。
- 默认从 jsdelivr CDN 加载 wasm,生产环境建议将 libpag wasm 部署到自己的静态服务器并修改 renderjs 中的 locateFile。
App 安卓/iOS
- 网络文件由 UTS 原生层下载到缓存目录,再由 renderjs 读取。
- 组件必须在页面
onUnload 时调用 destroy() 释放资源。
- renderjs 运行在 webview,性能低于原生渲染,复杂动效请真机测试。
微信小程序
- 必须复制 wasm 到
static/mp-weixin/ 并构建 npm。
- 本地
.pag 文件可能需要改后缀为 .png。
鸿蒙
- 需要 HBuilderX 4.23+ 与鸿蒙 vue3 项目。
- 实现方式:鸿蒙 vue 页面运行在 ArkWeb(webview)中,与 H5/App 端一样使用 renderjs + canvas + libpag-web 方案渲染(官方推荐,见 uni-app 文档:vue 页面可用 renderjs 集成 H5 版动画库)。
- 不要使用
@tencent/libpag(鸿蒙原生库)+ defineNativeEmbed 原生组件方案:实测该方案存在严重问题——1.0.1 版本在 API 20 设备上必然崩溃(libpag.so NAPI 回调与新版 SDK 不兼容);4.5.88 版本在 embed(NodeController)环境中 XComponent 无法渲染(空白)。renderjs 方案彻底绕开这些问题。
- 鸿蒙 repeatCount 语义与其他平台一致(插件内部已做映射)。
- 注意:鸿蒙工具链对工程目录路径有限制(≤110字符、无中文特殊字符),如项目路径过长需在
.hbuilderx/launch.json 配置 distPathDev/distPathBuild 指定短路径。
依赖版本
- libpag web: ^4.5.84
- libpag-miniprogram: latest
- 鸿蒙端无需 ohpm 原生依赖(采用 renderjs + libpag-web,不使用 @tencent/libpag 鸿蒙库)