2011-04-06 47 views
7

我有一個包含自定義視圖的滾動視圖。自定義視圖比屏幕區域大並且正確繪製。滾動查看優化

然而,scrollview往往會在滾動時不停地調用onDraw(),我似乎無法使其平滑。我使用ScrollView.getDrawingRect()來計算屏幕的可見部分,只繪製到那個,但它仍然返回整個視口(所以它被優化,不繪製屏幕外區域),而不是最後一個之間的增量位置和當前位置。理想情況下,我只想繪製三角洲,而不是整個可見窗口。

如果任何人都可以向我提供有關如何使用繪圖緩存的更多信息,並且如果這將有助於優化滾動,我很樂意實施它,或者任何其他可能的解決方案,我們將不勝感激。

回答

5

當滾動內容時,整個視口都需要重繪,因爲所有內容都已移動。我認爲不需要做任何事情來優化ScrollView - 如果滾動速度慢,那麼您的自定義視圖的繪製方法太慢了。

儘量避免在您的繪圖方法中創建對象,這通常是導致繪圖性能差的主要原因。

編輯:此外,滾動視圖可以快速向上或向下快速刷新仍然繪製在屏幕上的舊內容,然後請求重繪僅屏幕的「新」部分。 (僅適用於不透明視圖)。

+0

有更好的解決方案,我可以實現自己的緩存通過繪製我的視圖到位圖,然後繪製該位圖onDraw而不是重新計算我的視圖。 android視圖緩存應該能夠做類似的事情,並且文檔提示它,但是我從來沒有看過清楚解釋視圖緩存的東西。 – HaMMeReD 2011-04-06 21:40:29

+0

你看過http://groups.google.com/group/android-developers/browse_thread/thread/224457b8cb4e039c?pli=1。但我同意,繪圖緩存主題並沒有很好的討論。 – 2011-04-06 21:53:04

+0

現在我剛剛實現了位圖路由。在我的onDraw中,我看看是否有緩存位圖,如果它存在,則將其創建爲與視圖相同的尺寸,然後使用指向位圖的畫布調用舊的onDraw。比在常規的onDraw中,它只是繪製位圖。 這是一次記憶/性能折衷,但我在這裏可以,因爲這些觀點不應該太大。如果它不能分配緩存,我可以直接回到視圖。 – HaMMeReD 2011-04-06 22:06:18

-1

Afaik ScrollView在畫布上設置適當的剪輯矩形,您的視圖在onDraw中獲得,因此您只需繪製矩形內的內容。 您也可以根據剪輯矩形的大小實現緩存位圖。

1

我遇到了同樣的問題。我使用函數setDrawingCacheEnabled(true)解決了這個問題。通過啓用此設置,您的畫布視圖將被緩存爲位圖,因此每次調用onDraw()時都不必調用畫布的draw方法。

在您的自定義視圖的構造函數,你需要這樣的事情:

public CustomView(Context context) { 
    setDrawingCacheEnabled(true); 
    drawnFlag = false; 
} 

在你onDraw方法,你需要這樣的事情:

public void onDraw(Canvas canvas) { 
    if (! drawnFlag) { 
     canvas.drawPath(...); 
     canvas.drawPath(...); 
     drawnFlag = true; 
    } 
} 

現在,滾動這個自定義視圖應該平滑,因爲我們只調用繪圖方法一次。

+1

我不知道爲什麼沒有人提高你的答案。有用! @Andree – 2015-12-11 11:52:40