【问题标题】:HTML5 canvas context doesn't clear with clearRect()使用 clearRect() 无法清除 HTML5 画布上下文
【发布时间】:2015-04-29 15:46:30
【问题描述】:

我有两个画布:一个缓冲区和一个显示画布,其上下文通过缓冲区画布调用 drawImage()。在添加新对象和调用 drawImage() 之前,我 clearRect() 两个画布,但两者都显示所有先前添加的对象。这是添加对象的代码(查看下面的完整 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/

顶部是缓冲区(在此处单击鼠标以生成新的矩形),中间是我将缓冲区复制到的显示画布,底部是一个 img 元素,在我调用后显示缓冲区画布的内容clearRect() (它总是正确地不显示任何内容)。

这是怎么回事?

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    您忘记了每次使用 .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);
    });
    

    【讨论】:

    • 啊,谢谢,我以为你只需要在画线时开始/关闭路径。
    • 不要吹毛求疵,但closePath() 在使用fill() 时不是必需的,因为fill() 将在内部关闭它(临时)。无论如何,调用closePath() after fill() 是没有意义的。只是我的 2 美分。
    猜你喜欢
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多