基于svga+uniapp的微信小程序動畫組件開發指南

lottie動畫指南

效果

概述

本項目使用 svgaplayer.weapp.js 庫來實現 SVGA 動畫播放功能,支持在微信小程序、H5 等多端環境下播放高質量的矢量動畫。SVGA 是一種跨平臺的開源動畫格式,具有文件小、渲染性能高的特點。

技術棧

  • 核心庫: svgaplayer.weapp.js (專為小程序優化的 SVGA 播放器)
  • 框架: Vue 3 + Composition API
  • 平臺: 支持微信小程序、H5 等多端

(svgaplayer.weapp二次封裝)

項目結構

src/
├── components/
│   ├── common/
│   │   └── svgaPlayer.vue           # SVGA播放器核心組件
│   └── AnimationTemplate/
│       ├── index.vue                # 簡化版動畫模板組件
│       └── AnimationTemplate.vue   # 高級動畫模板組件
├── static/
│   └── js/
│       └── svgaplayer.weapp.js     # SVGA播放器庫文件
└── pages/└── sale-entry/└── index.vue               # 使用示例頁面

核心組件

1. SvgaPlayer 組件 (src/components/common/svgaPlayer.vue)

這是 SVGA 播放的核心組件,負責加載、解析和播放 SVGA 動畫文件。

主要特性:

  • 支持本地和遠程 SVGA 文件加載
  • 內置緩存機制,避免重復加載
  • 支持循環播放、播放控制
  • 提供豐富的回調函數
  • 自動適配不同平臺的 Canvas API

2. AnimationTemplate 組件

基于 SvgaPlayer 的封裝組件,提供了更易用的動畫展示模板。

主要特性:

  • 全屏遮罩展示
  • 支持多種位置布局(居中、頂部、底部)
  • 自動播放完成后隱藏
  • 支持手動關閉按鈕

使用方法

基礎使用

  1. 引入組件
<template><view><!-- 基礎使用 --><SvgaPlayerref="svgaPlayerRef":url="animationUrl":width="300":height="300":canvas-id="'myCanvas'":loops="1":clears-after-stop="true"/><!-- 模板組件使用 --><AnimationTemplateref="animationTemplateRef":animation-url="animationUrl":width="400":height="400":loops="1":show-close-button="true"@close="handleAnimationClose"@animationStart="handleAnimationStart"@animationEnd="handleAnimationEnd"/></view>
</template>
<script setup>
import SvgaPlayer from '@/components/common/svgaPlayer.vue';
import AnimationTemplate from '@/components/AnimationTemplate/AnimationTemplate.vue';const svgaPlayerRef = ref(null);
const animationTemplateRef = ref(null);
const animationUrl = 'https://xxx.***.com.cn/frontEnd/files/common/aidfinal1.svga';
</script>
  1. 程序化控制
// 開始播放動畫
const startAnimation = () => {if (animationTemplateRef.value) {// 設置回調函數setupAnimationCallbacks();// 開始播放animationTemplateRef.value.startAnimation();}
};// 設置動畫回調
const setupAnimationCallbacks = () => {if (animationTemplateRef.value) {// 動畫完成回調animationTemplateRef.value.setOnFinished(() => {console.log('動畫播放完成');animationTemplateRef.value.hide();});// 幀回調animationTemplateRef.value.setOnFrame((frame) => {console.log('當前幀:', frame);});// 進度回調animationTemplateRef.value.setOnPercentage((percentage) => {console.log('播放進度:', Math.round(percentage * 100) + '%');});}
};

API 接口

SvgaPlayer Props

參數類型默認值說明
urlString必傳SVGA 文件的 URL 地址
widthString/Number300動畫寬度
heightString/Number300動畫高度
canvasIdString‘svgaCanvas’Canvas 元素的 ID
loopsNumber1循環播放次數,0 表示無限循環
clearsAfterStopBooleanfalse播放完成后是否清除畫布

SvgaPlayer Methods

方法名參數說明
initPlayer()-初始化播放器
preload(url, callback)url: 預加載的 URL <br>callback: 回調函數預加載 SVGA 文件
showSvga()-顯示并播放動畫
startAnimation()-開始播放動畫
stopAnimation(clear)clear: 是否清除畫布停止播放動畫
pauseAnimation()-暫停播放動畫
setOnFinished(callback)callback: 回調函數設置播放完成回調
setOnFrame(callback)callback: 回調函數設置幀回調
setOnPercentage(callback)callback: 回調函數設置進度回調

AnimationTemplate Props

參數類型默認值說明
animationUrlString必傳SVGA 文件的 URL 地址
widthString/Number300動畫寬度
heightString/Number300動畫高度
canvasIdString‘animationTemplateCanvas’Canvas 元素的 ID
loopsNumber1循環播放次數
clearsAfterStopBooleanfalse播放完成后是否清除畫布
showCloseButtonBooleantrue是否顯示關閉按鈕
backgroundOpacityNumber0.5背景遮罩透明度
positionString‘center’動畫位置:‘center’, ‘top’, ‘bottom’
zIndexNumber9999層級索引

AnimationTemplate Methods

方法名參數說明
show()-顯示動畫
hide()-隱藏動畫
startAnimation()-開始播放動畫
stopAnimation()-停止播放動畫
preloadAnimation()-預加載動畫
setOnFinished(callback)callback: 回調函數設置播放完成回調
setOnFrame(callback)callback: 回調函數設置幀回調
setOnPercentage(callback)callback: 回調函數設置進度回調

AnimationTemplate Events

事件名參數說明
close-動畫關閉時觸發
animationStart-動畫開始播放時觸發
animationEnd-動畫播放結束時觸發

配置參數

SVGA 庫配置

SVGA 播放器支持多種路徑配置,組件會自動嘗試以下路徑:

// 相對路徑(推薦)
require('../../static/js/svgaplayer.weapp.js');// 根目錄路徑
require('/static/js/svgaplayer.weapp.js');// 當前目錄路徑
require('./svgaplayer.weapp.js');

Canvas 配置

  • 類型: type="2d" (推薦使用 2D Canvas)
  • 像素比: 自動適配設備像素比
  • 大小: 支持響應式尺寸設置

最佳實踐

1. 性能優化

// 預加載動畫文件
const preloadAnimations = async () => {if (svgaPlayerRef.value) {await svgaPlayerRef.value.preload(animationUrl);}
};// 使用緩存避免重復加載
const svgaCollection = {}; // 在組件內部已實現緩存

2. 錯誤處理

// 監聽加載失敗
const handleAnimationError = () => {console.error('SVGA動畫加載失敗');// 顯示備用方案或錯誤提示
};

3. 內存管理

// 組件銷毀時清理資源
onUnmounted(() => {if (animationTemplateRef.value) {animationTemplateRef.value.stopAnimation();}
});

4. 平臺兼容

// 檢查平臺支持
const checkSVGASupport = () => {// 組件內部已處理平臺兼容性return typeof SVGA !== 'undefined';
};

常見問題

Q1: 動畫播放不顯示或報錯?

A1: 檢查以下幾點:

  • 確認 SVGA 文件 URL 是否正確且可訪問
  • 檢查 Canvas 元素是否正確渲染
  • 查看控制臺是否有 SVGA 庫加載錯誤

Q2: 動畫播放卡頓或性能問題?

A2: 優化建議:

  • 使用預加載功能提前加載動畫文件
  • 控制動畫尺寸,避免過大的 Canvas
  • 及時清理不需要的動畫實例

Q3: 在不同平臺表現不一致?

A3: 處理方案:

  • 組件已內置多平臺適配邏輯
  • 如遇問題,檢查是否使用了平臺特定的 API
  • 確保 SVGA 文件格式符合標準

Q4: 動畫播放完成后如何處理?

A4: 使用回調函數:

animationRef.value.setOnFinished(() => {// 播放完成后的處理邏輯console.log('動畫播放完成');
});

示例代碼

完整使用示例

<template><view class="animation-demo"><!-- 觸發按鈕 --><button @click="startAnimation">開始播放動畫</button><!-- SVGA動畫組件 --><AnimationTemplateref="animationTemplateRef":animation-url="animationUrl":width="400":height="400":loops="1":show-close-button="true"position="center"@close="handleAnimationClose"@animationStart="handleAnimationStart"@animationEnd="handleAnimationEnd"/></view>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import AnimationTemplate from '@/components/AnimationTemplate/AnimationTemplate.vue';// 組件引用
const animationTemplateRef = ref(null);// 動畫配置
const animationUrl = 'https://static.wxb.com.cn/frontEnd/files/common/aidfinal1.svga';// 開始播放動畫
const startAnimation = () => {if (animationTemplateRef.value) {setupAnimationCallbacks();animationTemplateRef.value.startAnimation();}
};// 設置動畫回調
const setupAnimationCallbacks = () => {if (animationTemplateRef.value) {// 播放完成回調animationTemplateRef.value.setOnFinished(() => {console.log('SVGA動畫播放完成');animationTemplateRef.value.hide();uni.showToast({title: '動畫播放完成',icon: 'success',duration: 1500,});});// 幀回調(可選)animationTemplateRef.value.setOnFrame((frame) => {console.log('當前幀:', frame);});// 進度回調(可選)animationTemplateRef.value.setOnPercentage((percentage) => {console.log('播放進度:', Math.round(percentage * 100) + '%');});}
};// 事件處理
const handleAnimationClose = () => {console.log('動畫被手動關閉');
};const handleAnimationStart = () => {console.log('動畫開始播放');
};const handleAnimationEnd = () => {console.log('動畫播放結束');
};// 生命周期
onMounted(() => {// 可以在這里預加載動畫if (animationTemplateRef.value) {animationTemplateRef.value.preloadAnimation();}
});onUnmounted(() => {// 清理資源if (animationTemplateRef.value) {animationTemplateRef.value.stopAnimation();}
});
</script>
<style lang="scss" scoped>
.animation-demo {padding: 20rpx;
}
</style>

基礎播放器示例

<template><view class="basic-player"><SvgaPlayerref="svgaPlayerRef":url="animationUrl":width="300":height="300":canvas-id="'basicCanvas'":loops="0":clears-after-stop="false"/><view class="controls"><button @click="play">播放</button><button @click="pause">暫停</button><button @click="stop">停止</button></view></view>
</template>
<script setup>
import { ref } from 'vue';
import SvgaPlayer from '@/components/common/svgaPlayer.vue';const svgaPlayerRef = ref(null);
const animationUrl = 'https://static.wxb.com.cn/frontEnd/files/common/aidfinal1.svga';const play = () => {svgaPlayerRef.value?.startAnimation();
};const pause = () => {svgaPlayerRef.value?.pauseAnimation();
};const stop = () => {svgaPlayerRef.value?.stopAnimation(true);
};
</script>

總結

本 SVGA 動畫插件為項目提供了完整的矢量動畫播放解決方案,具有以下優勢:

  1. 高性能: 基于 Canvas 2D 渲染,支持硬件加速
  2. 跨平臺: 支持微信小程序、H5 等多端環境
  3. 易用性: 提供了簡單易用的組件 API
  4. 功能完整: 支持播放控制、回調監聽、預加載等功能
  5. 穩定性: 內置錯誤處理和資源管理機制

通過合理使用這些組件和 API,可以在項目中輕松實現高質量的動畫效果,提升用戶體驗。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88363.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88363.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88363.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構與算法——計算直線的交點數

前言&#xff1a; 這是之前做的一道筆試題&#xff0c;當時沒寫出來煩惱很久&#xff0c;這次記錄一下。 題目鏈接&#xff1a; Dotcpp--題目 1174: 計算直線的交點數 參考文章&#xff1a; CSDN--槐陽7--計算直線的交點數 題目&#xff1a; 解題思考&#xff1a; 在當時…

大模型及agent開發6 OpenAI Assistant API 高階應用 - 流式輸出功能

1.Assistant API 的主要優點&#xff1a; 減少編碼工作量、自動管理上下文窗口、安全的訪問控制、工具和文檔的輕松集成 本節講應用設計和性能流式輸出&#xff1a;借助流式輸出&#xff0c;可以讓應用程序實時處理和響應用戶輸入。具體來說&#xff0c;這種技術允許數據在生成…

React Native安卓劉海屏適配終極方案:僅需修改 AndroidManifest.xml!

&#x1f4cc; 問題背景在 React Native 開發中&#xff0c;我們經常會遇到安卓設備劉海屏&#xff08;Notch&#xff09;適配問題。即使正確使用了 react-native-safe-area-context 和 react-navigation&#xff0c;在一些安卓設備&#xff08;如小米、華為、OPPO 等&#xff…

Spring Boot整合MyBatis+MySQL實戰指南(Java 1.8 + 單元測試)

一、環境準備 開發工具&#xff1a;IntelliJ IDEA 2023.1 JDK 1.8.0_382 Maven3.6.3數據庫&#xff1a;MySQL 8.0.21依賴版本&#xff1a;<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifact…

游戲開發日記

如何用數據表來儲存&#xff0c;位置坐標&#xff08;XYZ&#xff09;&#xff1a;決定了對象在世界中的擺放資源ID / 圖片URL&#xff1a;決定了使用什么模型或貼圖事件ID / 特效&#xff1a;是否觸發某些事件&#xff08;例如點擊、交互&#xff09;邏輯索引&#xff08;Grid…

如何使用xmind編寫測試用例

如何使用xmind編寫測試用例為什么要使用xmind&#xff1f;使用xmind編寫測試用例是為了梳理我們的思路。使用xmind編寫測試用例的思路是什么&#xff1f;先進行分析再提取測試用例。 例如下面的注冊功能的測試用例的分析&#xff1a; 分析&#xff1a; 先提取出需要測試的功能點…

使用LLaMA-Factory微調Qwen2.5-VL-3B 的目標檢測任務-數據集格式轉換(voc 轉 ShareGPT)

一、LLaMA-Factory Qwen2.5-VL ShareGPT 格式要求ShareGPT 格式就是多輪對話的 list&#xff0c;每條數據如下&#xff1a;[{"conversations": [{"from": "user", "value": "<image>\n請標注圖片中的所有目標及其類別和位…

【SkyWalking】服務端部署與微服務無侵入接入實戰指南

【SkyWalking】服務端部署與微服務無侵入接入實戰指南 &#x1f4a1; SkyWalking 系列總引導 在微服務架構快速演進的今天&#xff0c;如何有效實現服務鏈路追蹤、性能分析、日志采集與自動化告警&#xff0c;成為系統穩定性的關鍵保障手段。 SkyWalking&#xff0c;作為 Apa…

LVDS系列20:Xilinx 7系ISERDESE2原語(一)

Xilinx 7系FPGA bank的io單元如下&#xff1a;Hr bank比hp bank少odelaye2組件&#xff0c;兩者的idelaye2組件后面&#xff0c;都有iserdese2組件&#xff1b; iserdese2組件是一種專用的串并轉換器或稱解串器&#xff0c;用于高速源同步應用&#xff0c;如大部分LVDS信號解析…

【U-Boot】Shell指令

目錄 U-Boot 三個Shell U-Boot Shell Linux Shell shell腳本 總結 U-Boot Shell命令 幫助命令 部分命令分類與功能說明 一、基礎操作與信息查詢 二、內存操作 三、啟動管理 四、文件系統操作 五、設備與分區管理 六、環境變量 七、診斷與調試 八、特殊功能 九…

《Revisiting Generative Replay for Class Incremental Object Detection》閱讀筆記

摘要Abstract部分 原文 Generative replay has gained significant attention in class-incremental learning; however, its application to Class Incremental Object Detection (CIOD) remains limited due to the challenges in generating complex images with precise …

Mysql: Bin log原理以及三種格式

目錄 一、什么是 Binlog&#xff1f; 二、Binlog 的應用場景與案例 1. 數據恢復 (Point-in-Time Recovery) 2. 主從復制 (Master-Slave Replication) 3. 數據審計 三、Binlog 的三種格式 1. STATEMENT 模式 (Statement-Based Logging - SBL) 2. ROW 模式 (Row-Based Log…

LiteHub之文件下載與視頻播放

文件下載 前端請求 箭頭函數 //這個箭頭函數可以形象理解為&#xff0c;x流入&#xff08;>&#xff09;x*x, //自然而然>前面的就是傳入參數,>表示函數體 x > x * x//相當于 function (x) {return x * x; }//如果參數不是一個&#xff0c;就需要用括號()括起來…

QT5使用cmakelists引入Qt5Xlsx庫并使用

1、首先需要已經有了Qt5Xlsx的頭文件和庫&#xff0c;并拷貝到程序exe路徑下&#xff08;以xxx.exe/3rdparty/qtxlsx路徑為例&#xff0c;Qt5Xlsx版本為0.3.0&#xff09;&#xff1b; 2、cmakelist中&#xff1a; # 設置 QtXlsx 路徑 set(QTXLSX_ROOT_DIR ${CMAKE_CURRENT_SOU…

醋酸鐠:閃亮的稀土寶藏,掀開科技應用新篇章

一、什么是醋酸鐠醋酸鐠是一種鐠的有機鹽&#xff0c;鐠是稀土金屬元素之一。作為一種重要的稀土化合物&#xff0c;醋酸鐠通常以水合物的形式存在&#xff0c;呈現淡黃色或無色結晶。鐠元素本身因其獨特的物理化學特性&#xff0c;在工業和科技領域有著廣泛應用&#xff0c;而…

深入解析JVM內存結構與垃圾回收機制

java是強類型高級語言JVM&#xff08;Java Virtual Machine&#xff0c;Java虛擬機&#xff09;是Java平臺的核心組件&#xff0c;它是一個虛擬的計算機&#xff0c;能夠執行Java字節碼&#xff08;bytecode&#xff09;。1、區域劃分JVM對Java內存的管理也是分區分塊進行&…

Java 流程控制詳解:從順序執行到跳轉語句,掌握程序邏輯設計

作為一名Java開發工程師&#xff0c;你一定知道&#xff0c;流程控制&#xff08;Flow Control&#xff09; 是編寫任何程序的核心。它決定了代碼的執行路徑、分支走向和循環次數。本文將帶你系統梳理 Java中的所有常用流程控制結構&#xff0c;包括&#xff1a;順序結構分支結…

面試150 環形鏈表

思路 采用雙指針法,slow指針每次走一步,fast指針每次走兩步&#xff0c;如果相遇的情況下&#xff0c;slow指針回到開始的位置,此時快慢指針各走一步&#xff0c;當相遇的時候也就是說明鏈表中有環。 # Definition for singly-linked list. # class ListNode: # def __init…

AI技術正在深度重構全球產業格局,其影響已超越工具屬性,演變為推動行業變革的核心引擎。

一、AI如何重塑AI的工作與行業&#xff08;AI助手領域&#xff09;能力升級理解與生成&#xff1a;基于LLM&#xff08;大語言模型&#xff09;&#xff0c;AI能處理開放式問題、撰寫報告、翻譯代碼&#xff0c;替代部分人類知識工作。個性化交互&#xff1a;通過用戶歷史對話分…

Kafka的無消息丟失配置怎么實現

那 Kafka 到底在什么情況下才能保證消息不丟失呢&#xff1f; Kafka 只對“已提交”的消息&#xff08;committed message&#xff09;做有限度的持久化保證。 第一個核心要素是“已提交的消息”。什么是已提交的消息&#xff1f;當 Kafka 的若干個 Broker 成 功地接收到一條…