2009-10-17 12 views
1

我在思考如何在Android中滾動「無限」,縮放狀態,控制的替代方案。簡單的想法是重新繪製每個滾動移動的整個視圖,但不知何故,它似​​乎不是正確的方式。可以事先畫出內容,但我不知道我應該在多大程度上製作視圖,以及當用戶滾動到視圖結束時會發生什麼?我想我需要向這個方向延伸看法。如何在Android中滾動「無限」寬視圖?

我是否應該以編程方式向線性佈局添加(並移除)視圖塊?聽到有關繪製這種長時間滾動自定義控件的經驗,我們將感到非常高興。

感謝 /埃裏克

+0

在我對這個另一個相關問題的思想上來。如果你覺得這個問題很有趣,那麼很有可能這個問題很有趣:) http://stackoverflow.com/questions/1635699/how-to-synchronize-content-of-one-view-depending-on -scroll-position-in-sibling-sc – SoManyDetails 2009-10-28 08:33:10

回答

1

如果您使用list/grid或任何使用Adapter的數據,您可以使用最優秀的通過類書面CommonsWare並可以在這裏找到:

http://github.com/commonsguy/cwac-endless

它是專門爲此

+0

這看起來很有希望,但我沒有看過組件的細節。演示似乎暫停並顯示進度thingy而檢索額外的意見。我希望通過在實際需要之前渲染可能在屏幕上滾動的視圖一段時間,讓控件感覺更加無縫。你知道這個組件是否可行?文檔有點簡單。 – SoManyDetails 2009-10-28 08:29:29

1

使用的屏幕外緩衝區控件的大小。

起初做它簡單的方法。繪製整個屏幕緩衝區滾動到正確的位置。準備好後,將其投影到實際屏幕上。

如果這太慢了,可以嘗試通過不重畫整個offscreenbuffer來優化它,而是通過垂直分割來實現:(我現在只是在討論一個水平滾動運動,以使這個概念更易於理解。這種方法也適用於8種方式的滾動)

這實現起來有些棘手(這就是爲什麼我首先提出了簡單的方法),但是試着想象一張帶有圖片的紙張,並且左側環繞和將它粘到右側(這樣你就可以得到一個管子)。這樣您可以無限地滾動紙張(通過圍繞它的y軸旋轉管)。

類似地,您也可以對屏幕外的緩衝區執行相同操作。通過在屏幕上繪製完整內容來準備屏幕外緩衝區。

現在滾動到右邊,你基本上將屏幕外緩衝區分成2(通過這個垂直分割(就像膠水所在的例子中的紙張一樣))。假設你向右滾動10個像素,你要做的是:

  • 將分割的右側(位於像素10)複製到控件的像素0。 (所以整個區域從(10,0) - (寬 - 高)到:(0,0)
  • 然後複製split的左側:像素0到10到像素寬度-10。 0,0) - (10,高度)(寬度10,0)

之前,你這樣做只是重繪已被改變(在這種情況下,10個像素,因爲我們滾動10個像素像素) 。所有其他像素仍然是相同的,不需要重新繪製。

你必須親自在紙上畫出來才能真正理解它。這是一種在資源有限的平臺上進行遊戲開發的常見技術(手機等)

p.s.可以以完全相同的方式實現向各個方向的滾動(儘管更難以正確實現); ^)

+0

感謝這個不錯的算法。這似乎有可能使其適應行爲,但它似乎需要比Reflog建議的組件更詳細的開發。因此,我會做出答案。 – SoManyDetails 2009-10-28 08:31:36

1

有點遲到了,但我想我會告訴你一個更簡單的方法去: 你只需要你的背景的視圖的大小或屏幕尺寸, d然後調用下面的代碼(假設您擴展視圖並覆蓋onDraw):

private void drawEndlessBackground(Canvas canvas, float left, float top) { 

    float modLeft = left % screenWidth; 

    canvas.drawBitmap(backgroundImage, modLeft, top, null); 

    if (left < 0) { 

     canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null); 

    } else { 

     canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null); 

    } 



} 
0

在XML中怎麼樣? 私人無效drawEndlessBackground(帆布油畫,左浮動,浮動頂部){

float modLeft = left % screenWidth; 

canvas.drawBitmap(backgroundImage, modLeft, top, null); 

if (left < 0) { 

    canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null); 

} else { 

    canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null); 

}