You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
4.5 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view :key="cKey" class="tm-lottie flex-center">
<!-- #ifndef H5 -->
<canvas :style="{ width: w_w + 'px', height: h_h + 'px' }" id="cid" canvas-id="cid" class="cid"></canvas>
<!-- #endif -->
<!-- #ifdef H5 -->
<canvas :style="{ width: w_w + 'px', height: h_h + 'px' }" :id="cuid" :canvas-id="cuid"></canvas>
<!-- #endif -->
</view>
</template>
<script>
import lottie from 'tm-vuetify/tool/function/lottie.js';
export default {
name: 'tm-lottie',
props: {
width: {
type: Number | String,
default: 420
},
height: {
type: Number | String,
default: 420
},
url: {
type: String||Object,
default: ()=>{
return "";
}
},
loop: {
type: Boolean,
default: true
},
autoplay: {
type: Boolean,
default: true
}
},
computed: {
w_w: function() {
return uni.upx2px(this.width);
},
h_h: function() {
return uni.upx2px(this.height);
}
},
data() {
return {
cuid: 'cid',
cKey: ''
};
},
created() {
// #ifdef H5
this.cuid = this.$tm.guid();
// #endif
this.cKey = this.$tm.guid();
},
destroyed() {
// 释放内存。
lottie.destroy()
},
async mounted() {
if (this.url) {
this.$nextTick(async function() {
await this.LoadLottiePlay_Mp();
});
}
},
methods: {
async LoadLottiePlay_Mp(url) {
const canvasContext = uni.createCanvasContext(this.cuid, this);
// #ifdef MP-WEIXIN || MP-ALIPAY
// let canvas = await this.getNodeCanvasNodeRef();
// console.log(canvas);
// #endif
// 请求到的lottie json数据
let animationData=null
// 请求lottie的路径。注意开启downloadFile域名并且返回格式是json
const animationPath = url || this.url;// url || this.url
if(typeof animationPath ==='string'&&animationPath!=''){
let p = await this.rloadJson(animationPath).catch(e=>{
uni.$tm.toast(JSON.stringify(e));
})
animationData = JSON.parse(p.data.data)
}else{
animationData = url;
console.log(animationData)
}
if(!animationData) return;
// 指定canvas大小
canvasContext.canvas = {
width: this.w_w,
height: this.h_h
};
try {
// 如果同时指定 animationData 和 path 优先取 animationData
lottie.loadAnimation({
renderer: 'canvas', // 只支持canvas
loop: this.loop,
autoplay: this.autoplay,
animationData: animationData,
path: '',
rendererSettings: {
context: canvasContext,
clearCanvas: true
}
});
} catch (e) {
console.log(e);
}
},
//mp alipay
getNodeCanvasNodeRef(){
return new Promise((resolve,reject)=>{
const query = uni.createSelectorQuery().in(this)
query
.select('.cid')
.fields({ node: true, size: true })
.exec(res => {
console.log(res);
const canvasNode = res[0].node
const canvasDpr = uni.getSystemInfoSync().pixelRatio
const canvasWidth = res[0].width
const canvasHeight = res[0].height
const ctx = canvasNode.getContext('2d')
resolve(ctx,{dpr:canvasDpr,width:canvasWidth,height:canvasHeight,node:canvasNode});
})
})
},
async LoadLottiePlay_H5(url) {
const canvasContext = uni.createCanvasContext(this.cuid, this);
// 请求到的lottie json数据
let animationData=null
// 请求lottie的路径。注意开启downloadFile域名并且返回格式是json
const animationPath = url || this.url;// url || this.url
// 指定canvas大小
canvasContext.canvas = {
width: this.w_w,
height: this.h_h
};
try {
// 如果同时指定 animationData 和 path 优先取 animationData
lottie.loadAnimation({
renderer: 'canvas', // 只支持canvas
loop: this.loop,
autoplay: this.autoplay,
animationData: '',
path: animationPath,
rendererSettings: {
context: canvasContext,
clearCanvas: true
}
});
} catch (e) {
console.log(e);
}
},
play() {
lottie.play();
},
stop() {
lottie.stop();
},
pause() {
lottie.pause();
},
rloadJson(url){
return new Promise((res,rej)=>{
uni.request({
responseType:'json',
url:url,
success: (v) => {
res(v)
},
fail: (e) => {
console.log(e);
rej(e)
}
})
})
},
// type:1正向播放-1反向
setDirection(type = 1) {
lottie.setDirection(type);
},
async registerAnimation(url) {
if (!url) return;
lottie.destroy();
this.cKey = this.$tm.guid();
await this.LoadLottiePlay_Mp(url);
lottie.resize();
}
}
};
</script>
<style lang="scss"></style>