wx.canvasToTempFilePath(OBJECT, this)
把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径。在自定义组件下,第二个参数传入组件实例this,以操作组件内 <canvas/> 组件
现象:在性能不强的安卓机上,调用时会出现这一报错,本人的三星 S7 sdge和同事的小米MAX上都大概率出现。
解决办法: 延迟调用或者错误回调中进行处理。
延迟调用
这一报错在微信开发者论坛中被多次提及,最多被提到的就是这一方法。
wx.draw(false, () => {
setTimeout(()=>{
wx.canvasToTempFilePath();
}, 200);
});
wx.draw()是一个异步执行的api,canvasToTempFilePath需要在其回调中执行。延迟200毫秒一般就可以解决这个问题。
当这个api只执行一次时延迟200毫秒其实无所谓,但是多次调用时,这个延迟也浪费了不少时间。对于性能强大的手机,这也是一种浪费,一般只有性能较弱的安卓机才会出现这个问题。所以我更建议大家使用下面一个。
错误回调处理
canvasToTempFilePath本身也是异步api,有错误回调可以使用。
let count = 0;
function getTempFile(otherOptions) {
wx.canvasToTempFilePath({
...otherOptions,
success: () => {},
fail: (error) => {
const { errMsg } = error;
// 可能会有其他报错 还是拦截一下吧
if ( errMsg === '具体报错' ) {
// 一次不行再试一遍 两次都不过就放弃吧
count += 1;
if (count < 3) {
getTempFile(otherOptions);
}
else {
// 错了这么多遍基本没救了
}
}
},
});
}
我的项目中需要绘制的图片大小为180*180px,耗时基本在50-100ms左右。报错一次以后canvas基本也就准备好了,一般不会错第三遍。
题外话:这一个api的耗时与画布大小密切相关,也建议大家绘制图片时一定要控制好canvas画布大小。比方说,绘制200*200的图片,canvas要大小一致。尤其是图片数量比较大时,在模拟器上体现不出差别,但是手机上影响很大。
网友评论