当您设置canvas.width或canvas.height它清除画布,以重绘结合这会导致你看到的闪烁。
您可以在调整大小之前将画布保存到临时画布,然后再将其重新绘制回来,从而在合理范围内减轻此限制。
这是我的调整大小功能:
function resize(width, height) {
//Create temp canvas and context
var tempContext = Utils.Canvas.Create2DContext(context.canvas.width, context.canvas.height);
//Draw current canvas to temp canvas
tempContext.drawImage(context.canvas, 0, 0);
//Resize current canvas
context.canvas.height = height;
context.canvas.width = width;
//Draw temp canvas back to the current canvas
context.drawImage(tempContext.canvas, 0, 0);
}
如果调整到更小的尺寸,然后临时画布是“透支”,所以它会完全填满当前画布。但是,如果您调整为较大的大小,那么您的临时画布将仅填充当前画布的一部分。它未填充的部分在重绘时仍会闪烁。
如果您想要获得更多幻想,您可以尝试绘制正确(最终)尺寸的临时画布,而不是简单地复制当前画布。这会更慢,但可以消除所有闪烁。
在我的情况下,我调整大小以填满div,因此沿着底部和右边缘闪烁一点是可以忍受的,当然比整个闪烁更好。
编辑:
这是你的jsfiddle的更新应用了我的变化:
jsfiddle.net/Uz5Pt/13
看来工作比我使用它在我的应用程序更好的地方!几乎看不到任何新创建的画布上闪烁。
感谢您的回答。我不确定这与我正在做的事情有什么不同,因为我在调整大小后通过我的'draw'函数重绘了整个事物。问题似乎是浏览器调整大小,清除,绘制,然后调用我的重绘,然后再绘制。你有没有尝试增加我的jsFiddle中的滑块? – 2013-05-16 17:30:44
嗨德鲁,我冒昧地将我的修复应用到你的jsFiddle。 http://jsfiddle.net/Uz5Pt/13/希望它会适合你想要的! – AndyJ 2013-05-17 15:53:43
谢谢,这看起来不错。我会进一步看看尝试,看看为什么这样的作品,但我的代码没有。你能告诉?如果您将滑块拖动到零,您的小提琴也会中断:) – 2013-05-17 16:14:28