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

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

常见问题

draw无法绘制图形

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

javascript 复制代码
const context = uni.createCanvasContext(canvasId,componentInstance);
//...

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

html 复制代码
<canvas canvas-id="canv" id="canv" type="2d"></canvas>

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

draw绘制后无回调

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

javascript 复制代码
draw(false, () => {
	//绘制完成后在这里执行回调
})

调试时发现未执行回调callback

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

javascript 复制代码
draw(false, setTimeout(() => {
	//这里执行回调
	callback()
}, 258))

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

抛出错误

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(),代码如下

javascript 复制代码
let ctx = canvas.getContext('2d');
let data = ctx.getImageData(x,y,width,height);

uni.canvasPutImageData

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

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

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

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

javascript 复制代码
let ctx = canvas.getContext('2d');
ctx.putImageData(imageData,x,y);

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

然后,draw()方法就无法绘制了,

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

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

javascript 复制代码
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()

使用插件

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

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

zs-canvas

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

对新手来说,若觉得使用条件编译太麻烦,可以试试uniapp项目的画布插件 zs-canvas

将插件导入到自定义组件文件夹中就可以用,注意细节看说明文档,用法与uniapp API文档大同小异

写到这里,点赞的人在哪呢 (⌐■_■)

相关推荐
Greg_Zhong10 分钟前
微信小程序中使用云函数调用豆包免费模型,部署云函数设置(触发器)执行每日自动生成书籍的文章赏析,完整过程
微信小程序·ai工程师·小程序中豆包模型调用·云函数配置触发器生成每日文章·微信云函数
eric*168837 分钟前
微信小程序全局安全水印组件实践:支持动态更新、全局生效、自定义样式
微信小程序·小程序
Geek_Vison42 分钟前
三款小程序容器技术选型对比分析——融媒新闻APP如何进行技术选型~
小程序·uni-app·app开发·finclip·小程序开发平台·跨端开发·小程序容器
DK1858383225211 小时前
知识付费会员小程序/付费圈子系统——课程兑换码+会员体系完整实战,开源运营级方案
小程序·uni-app·开源·php
杰建云16721 小时前
微信小程序自制全流程实测与避坑指南
微信小程序·小程序
kyh10033811201 天前
微信小程序 聚合摇骰喝酒工具 完整实现(含源码)
微信小程序·小程序·摇骰子小游戏
Greg_Zhong1 天前
微信小程序中实现自定义圆形进度条
微信小程序·自定义圆形进度条
好赞科技1 天前
2026年五大精选微信小程序,革新效率体验提升智能生活品质
大数据·微信小程序
陈龙龙的陈龙龙1 天前
uni-app中获取参数的几个方法
uni-app
果壳~1 天前
【Uniapp】【rich-text】富文本展示以及图片预览功能解决方案
前端·javascript·uni-app