HTML5 canvas 上下文未使用 clearRect() 清除
HTML5 canvas context doesn't clear with clearRect()
我有两个 canvases:一个缓冲区和一个显示器 canvas,其上下文通过缓冲区 canvas 调用 drawImage()。我在添加新对象和调用 drawImage() 之前都清除了 canvases,但都显示了所有先前添加的对象。这是对象添加代码(查看下面的完整 JSFiddle):
ctx.clearRect(0, 0, 500, 500);
buf.clearRect(0, 0, 500, 500);
img.src = bufCanvas.toDataURL();
buf.fillStyle = 'hsl(' + ~~(Math.random()*360) + ', 100%, 70%)';
buf.rect(Math.random()*w, Math.random()*h, 20, 20);
buf.fill();
ctx.drawImage(bufCanvas, 0, 0);
JSFiddle:http://jsfiddle.net/3movoayv/10/
上面是buffer(点击鼠标可以生成新的rects),中间是我把buffer复制到的显示器canvas,下面是img元素,显示内容调用 clearRect() 后的缓冲区 canvas(始终正确显示任何内容)。
这是怎么回事?
您忘记了每次使用 .beginPath()
开始新路径(防止您遇到的事件堆叠问题):
bufCanvas.addEventListener('mousedown', function (e) {
ctx.clearRect(0, 0, 500, 500);
buf.clearRect(0, 0, 500, 500);
img.src = bufCanvas.toDataURL();
buf.beginPath(); // < begin a new path
buf.fillStyle = 'hsl(' + ~~(Math.random()*360) + ', 100%, 70%)';
buf.rect(Math.random()*w, Math.random()*h, 20, 20);
buf.fill();
ctx.drawImage(bufCanvas, 0, 0);
});
我有两个 canvases:一个缓冲区和一个显示器 canvas,其上下文通过缓冲区 canvas 调用 drawImage()。我在添加新对象和调用 drawImage() 之前都清除了 canvases,但都显示了所有先前添加的对象。这是对象添加代码(查看下面的完整 JSFiddle):
ctx.clearRect(0, 0, 500, 500);
buf.clearRect(0, 0, 500, 500);
img.src = bufCanvas.toDataURL();
buf.fillStyle = 'hsl(' + ~~(Math.random()*360) + ', 100%, 70%)';
buf.rect(Math.random()*w, Math.random()*h, 20, 20);
buf.fill();
ctx.drawImage(bufCanvas, 0, 0);
JSFiddle:http://jsfiddle.net/3movoayv/10/
上面是buffer(点击鼠标可以生成新的rects),中间是我把buffer复制到的显示器canvas,下面是img元素,显示内容调用 clearRect() 后的缓冲区 canvas(始终正确显示任何内容)。
这是怎么回事?
您忘记了每次使用 .beginPath()
开始新路径(防止您遇到的事件堆叠问题):
bufCanvas.addEventListener('mousedown', function (e) {
ctx.clearRect(0, 0, 500, 500);
buf.clearRect(0, 0, 500, 500);
img.src = bufCanvas.toDataURL();
buf.beginPath(); // < begin a new path
buf.fillStyle = 'hsl(' + ~~(Math.random()*360) + ', 100%, 70%)';
buf.rect(Math.random()*w, Math.random()*h, 20, 20);
buf.fill();
ctx.drawImage(bufCanvas, 0, 0);
});