• 【uniapp】使用canvas组件编译到微信小程序兼容出错问题


    使用uniapp编译跨平台项目会遇到不少兼容问题,这里主要讲canvas组件的,编译到微信小程序会有兼容出错问题,这里给讲一下解决方案,希望有帮助。

    常见问题

    draw无法绘制图形

    如果使用CanvasContext绘制,以下代码,编译到微信小程序上可能发现绘制不出来

    const context = uni.createCanvasContext(canvasId,componentInstance);
    //...
    
    • 1
    • 2

    看canvas组件的属性type="2d"是否有加,要去掉,因为它,会导致无法绘制

    <canvas canvas-id="canv" id="canv" type="2d">canvas>
    
    • 1

    测试type="webgl"也会无法绘制

    draw绘制后无回调

    如果是类似以下代码,调用draw(reserve,callback)绘制方法

    draw(false, () => {
    	//绘制完成后在这里执行回调
    })
    
    • 1
    • 2
    • 3

    调试时发现未执行回调callback

    这个原因未知,搜索网上的说改使用以下方法看看能否解决

    draw(false, setTimeout(() => {
    	//这里执行回调
    	callback()
    }, 258))
    
    • 1
    • 2
    • 3
    • 4

    不建议用,编译到其它平台可能会报类型错误

    抛出错误

    uni.canvasToTempFilePath

    这是将画布导出成图片的方法,

    编译在微信小程序上运行报错内容如下,使用uni.canvasToTempFilePath报错

    canvasToTempFilePath:fail fail canvas is empty
    在这里插入图片描述

    这是需要多传一个canvas,看看微信小程序的官方文档是这样写的

    有个文章可以看看 canvasToTempFilePath:fail fail canvas is empty

    里面讲了,组件canvas需要设置属性type="2d"才能获取,

    而uniapp文档上没有说,加这个就无法绘制…

    uni.canvasGetImageData

    这是获取图像数据的方法,

    编译在微信小程序上运行报错内容如下,使用uni.canvasGetImageData也报错了

    canvasGetImageData:fail fail canvas is empty

    需要获取到canvas元素,然后使用它的原生方法ctx.getImageData(),代码如下

    let ctx = canvas.getContext('2d');
    let data = ctx.getImageData(x,y,width,height);
    
    • 1
    • 2

    uni.canvasPutImageData

    这是设置图像数据的方法,

    编译在微信小程序上运行,使用uni.canvasPutImageData也会报错,

    报错和上面的问题一样,都是没有获取到canvas造成的,

    需要获取到canvas元素,然后使用它的原生方法ctx.putImageData(),代码如下

    let ctx = canvas.getContext('2d');
    ctx.putImageData(imageData,x,y);
    
    • 1
    • 2

    组件canvas需要设置属性type="2d"才能获取canvas,
    然后,draw()方法就无法绘制了,

    这个2d属性值有的要有的不要,该怎么办呢,这是个兼容问题,试试用条件编译,

    如把组件canvas加上属性type=2d,就用以下代码才能获取canvas

    uni.createSelectorQuery().in(this).select("#canv").fields({
    	size:true,
    	// #ifdef MP-WEIXIN
    	node:true
    	// #endif
    },res=>{
    	//res.node 就是 canvas 2d元素
    	let canvas = res.node;
    	//...
    }).exec()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用插件

    可以看看这篇文章 微信小程序提示wx.createCanvasContext方法已废弃的解决方案

    用上面讲得已废弃的解决方案重写,绘制逻辑就按照draw()的绘制原理方法实现即可,

    zs-canvas

    使用条件编译,把编译到微信小程序的代码段区分开来,

    对新手来说,若觉得使用条件编译太麻烦,可以试试uniapp项目的画布插件 zs-canvas
    将插件导入到自定义组件文件夹中就可以用,注意细节看说明文档,用法与uniapp API文档大同小异

    写到这里,点赞的人在哪呢 (⌐■_■)
    请添加图片描述

  • 相关阅读:
    AIGC实战——深度学习 (Deep Learning, DL)
    OBS-VirtualCam OBS的虚拟摄像头插件
    oracle从入门到精通第五篇(视图|表空间|索引|存储过程|触发器|复制表)
    C语言文件操作
    基于ZYNQ的PCIE高速数据采集卡的设计(三)硬件设计
    我干了8年测试,告诉你现在软件测试还能不能找到工作!
    百度智能云千帆Appbuilder全面升级!可玩性更强!速来体验!
    2022-2023年度必备宇宙最全Windows系统软件清单
    OpenJudge NOI题库 入门 116题 (二)
    【Java面试】概念性的问题怎么答,看完高手的回答一口气答出完整思路,Nosql的理解
  • 原文地址:https://blog.csdn.net/zs1028/article/details/132553976