vue使用,引用 腾讯pag 播放文件,且解决销毁问题

PAG官网:官网

https://pag.art/docs/sdk.html#web-端接入

一、创建依赖准备

复制代码
libpag.min.js
libpag.wasm

去git上下载就行了

https://github.com/Tencent/libpag/releases/tag/v4.3.3

下载 libpag_4.3.3_web.zip 里边有

两个文件放到 public 中

二、index.html引入

复制代码
只引入这一个就行
<script src="libpag.min.js"></script>

三、创建组件

复制代码
<script>
export default {
  name: "CanvasPag",
  props: {
    canvasId: String,
    url: String,
    scaleWidth: {
      type: Number,
      default: 0.58
    },
     scaleHeight: {
      type: Number,
      default: 0.58
    },
    canvasStyle: String,
  },
  data() {
    return {
      renderingId: undefined,
      canvasRef: undefined,
    }
  },
  created() {
    this.renderingId = this.canvasId || this.randomId()
  },
  mounted() {
    this.createdPag()
  },
  methods: {
    randomId(lenNum, radixNum) {

      let len = lenNum || 32, radix = radixNum || 16

      let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
      let uuid = []
      let i
      radix = radix || chars.length
      if (len) {
        for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
      } else {
        var r
        uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
        uuid[14] = '4'
        for (i = 0; i < 36; i++) {
          if (!uuid[i]) {
            r = 0 | Math.random() * 16
            uuid[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r]
          }
        }
      }
      return uuid.join('')
      },
    async createdPag() {

      const PAG = await window.libpag.PAGInit();

      let url = "/pag/" + this.url + ".pag"

      let id = this.renderingId
       const buffer = await fetch(url).then((response) => {
        return response.arrayBuffer()
      })

      const pagFile = await PAG.PAGFile.load(buffer)

      // 设置宽高
      const pagComposition = PAG.PAGComposition.make(pagFile.width(), pagFile.height());
      // 宽高的缩放比例
      const matrix1 = PAG.Matrix.makeScale(this.scaleWidth, this.scaleHeight);

      // 修改比例
      pagFile.setMatrix(matrix1);

      pagComposition.addLayer(pagFile);
      const canvas = document.getElementById(id);

      if (canvas !== null) {
        canvas.width = pagComposition.width();
        canvas.height = pagComposition.height();
        const pagView = await PAG.PAGView.init(pagComposition, canvas);
        // Set PAGView play infinity.
        pagView.setRepeatCount(0);
        await pagView.play();

        this.canvasRef = pagView
      }
    },
    async destroy() {
      const pagDom = document.querySelectorAll('.pag-zk');
      if (pagDom) {
        console.log('webgl清空内容')
        await pagDom.forEach((item)=>{
          const gl = item.getContext("webgl");
          gl.clear(gl.COLOR_BUFFER_BIT);
        })
      }
      if (this.canvasRef?.pagSurface) {
        console.log('pag清空内容')
        await this.canvasRef.pagSurface.clearAll();
      }
      if (this.canvasRef?.isPlaying) {
        this.canvasRef.isPlaying = false
      }
      await this.canvasRef?.destroy();
    }
      },
  beforeDestroy() {
    this.destroy()
  }
}
</script>

<template>
  <canvas :id="renderingId" :style="canvasStyle" :key="renderingId + 'pagkey'" class="pag-zk"></canvas>
</template>

四、main.js注册全局组件

复制代码
import CanvasPag from '@/components/CanvasPag/index.vue'

Vue.component('canvas-pag',CanvasPag)

五、页面使用

复制代码
   <canvas-pag
     key="jkzt-blue"
     url="yxzz"
     style="position: absolute;top: -22px;"
   ></canvas-pag>
相关推荐
excel11 分钟前
webpack 核心编译器 十四 节
前端
excel18 分钟前
webpack 核心编译器 十三 节
前端
腾讯TNTWeb前端团队7 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰11 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪11 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪11 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy12 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom12 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom12 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom12 小时前
React与Next.js:基础知识及应用场景
前端·面试·github