2014-03-13 120 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