當您設置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