var img=document.getElementById("scream"); img.onload = function() { ctx.drawImage(img,10,10); }
Q2.canvas上画图出现闪屏
A2.闪屏的原因是 clearRect
清除画布后,绘制的时间较长导致出现闪屏的现象。
可用双缓存写法:新建一个 canvas 作为 缓存 canvas ,通过 缓存 canvas 完成绘制过程,绘制完成后,直接将 缓存 canvas 复制到原来的 canvas,这样就可以解决绘制时间过长导致的闪屏问题。
// 关键代码
updateCanvas(){ const canvas = document.getElementById('canvas'); // 获取页面中的 canvas const ctx = canvas.getContext('2d'); const tempCanvas = document.createElement('canvas'); // 新建一个 canvas 作为缓存 canvas const tempCtx = tempCanvas.getContext('2d'); tempCanvas.width = 1448; tempCanvas.height = 750; // 设置宽高 // 开始绘制 tempCtx.drawImage(bg,0,0); // 背景 ... // 省略其他绘制过程 // 缓存 canvas 绘制完成 ctx.clearRect(0,0,1448,750); // 清空旧 canvas ctx.drawImage(tempCanvas,0,0); // 将缓存 canvas 复制到旧的 canvas }
Q3: 在dialog中使用画布canvas的时候会提示报错Cannot read property ‘getContext’ of null"
A3:在获取的方法里面加上this.$nextTick()
,具体代码如下所示:
this.$nextTick(() => { var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d");
}
this.$nextTick()的作用:将回调延迟到下次 DOM 更新循环之后执行
解释:当dialog打开时,这时候canvas有可能并没有被渲染出来,这个时候去获取canvas元素会报错;而this.$nextTick()
在这里实际上指的是等待dialog里面的canvas渲染完,再去执行里面的代码