2014-03-13 321 views
7

我有一個自定義視圖(寬度= 2000)在水平滾動視圖(寬度= 480)內。所以有一個可滾動的區域。onDraw滾動視圖內的自定義視圖

當調用onDraw()時,髒矩形(由getClipBounds()返回)返回整個視圖的尺寸,所以我繪製包括不可見區域的整個視圖。因此,當我滾動,onDraw()不叫任何更多,因爲成爲可見的區域已經繪製並以某種方式記住。

public void onDraw(Canvas canvas) 
{ 
    canvas.getClipBounds(r); // returns 2000 x 400 
} 

這工作正常!
但是我的自定義視圖可以像寬2萬以上,事情開始變得緩慢。我擔心的是緩存的圖形使用大量的內存。我不認爲繪畫是被保存爲位圖,因爲這已經崩潰,所以如何在這些繪製命令(線條和文字,大多是)被保存? 有沒有一種方法可以指定onDraw()只應請求視圖的可見部分,並且在滾動時它一直呼叫onDraw()?或者還有其他方法嗎?

謝謝!

回答

3

Android使用hardware accelerated "display lists"來自Android 3.0以後的繪圖。這會導致整個視圖的顯示列表被緩存。

如果ScrollView內的視圖非常大,您可以使用disable hardware acceleration作爲視圖。

我們通過繼承滾動型以及與此重寫onAttachedToWindow()方法做到這一點:

@Override 
protected void onAttachedToWindow() 
{ 
    setLayerType(LAYER_TYPE_SOFTWARE, null); 
} 
+0

你真的救我的天!我在「http://www.codeitive.com/0yxVVjeeeV/ondraw-custom-view-inside-a-scrollview.html」看到這個答案,它解決了我滾動視圖中的文本視圖在滾動過程中總是產生一些打嗝的問題。我搜索網在這裏找到這個答案給你一票。謝謝。 – Surely