2010-01-11 15 views
7

我想實現HTML5 canvas元素內容的垂直滾動。我不想再次呈現整個內容。相反,我想將整個內容向上/向下移動,並只渲染已滾動到視圖中的區域。什麼是在HTML5 canvas元素內移動矩形(像素)區域的最快方法

我嘗試使用getImageDataputImageData函數,但在我的測試中,它們幾乎和重繪整個場景一樣緩慢。

// scroll 20px down 
var data = ctx.getImageData(0, 0, width, height-20); 
ctx.putImageData(0, 20); 

複製畫布元素中矩形像素區域的最快方法是什麼?

回答

12

嘗試這種情況:

ctx.drawImage(ctx.canvas, 0, 0, width, height-20, 0, 20, width, height-20); 

drawImage可以帶有HTMLImageElement,一個HTMLCanvasElementHTMLVideoElement對於第一個參數。

7

對於絕對速度,我會用一個過大<canvas><div>overflow:hidden設置,則使用常規的DOM方法來滾動<div><canvas>

當然,這犧牲了內存使用,以支持速度。

+0

好主意,但不幸的是我不知道確切的大小,滾動區域可能有數千像素的高度,所以我不認爲這對我有用。 – 2010-01-11 12:22:08

+0

我希望在我的應用程序中實現滾動之前,我已經知道了這種方法。我用一個大的隱藏畫布和一個小視口畫布使用雙緩衝。然後我將隱藏的新可見部分複製到視口。它可以工作,但可能會更快。如果圖像可能高達數千像素,我的解決方案將無法工作。 – 2010-01-21 04:29:05

+0

但是如果沒有期望能夠向下滾動,當到達底部時,您可以重新繪製新的「超大」畫布上的最後一個屏幕。如果你有任何停機時間(比如在信息流中暫停),你可以重繪和截斷,然後甚至沒有人注意到。前一種技術並沒有消除延遲,但它肯定會限制它發生得少得多。 – 2010-05-04 23:28:53