在ScrollView中绘制自定义视图的onDraw方法

7
我有一个自定义视图(宽度为2000),位于一个水平滚动视图内(宽度为480)。因此,有一个可滚动的区域。
当调用 onDraw()时,脏矩形(由 getClipBounds()返回)返回整个视图的尺寸,因此我绘制整个视图,包括不可见的区域。因此,在滚动时, onDraw()不再被调用,因为已经绘制了变得可见的区域,并且某种程度上被记住了。
public void onDraw(Canvas canvas)
{
    canvas.getClipBounds(r); // returns 2000 x 400
}

这很好运行!
然而,我的自定义视图可能会达到20000或更多像素宽,这时速度开始变慢。我担心缓存的绘画使用了大量内存。我认为绘制没有被保存为位图,否则它已经崩溃了,那么这些绘制命令(主要是线条和文本)是如何保存的呢? 有没有一种方式可以指定只请求视图的可见部分,当滚动时保持调用onDraw()?或者有其他方法吗? 谢谢!
1个回答

3

自Android 3.0以来,Android使用硬件加速的"display lists"进行绘制。这会导致整个视图的显示列表被缓存。

如果ScrollView中的视图非常大,您可以禁用视图的硬件加速

我们通过子类化ScrollView并覆盖onAttachedToWindow()方法来实现此目的:

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

你真的救了我的一天!我在“http://www.codeitive.com/0yxVVjeeeV/ondraw-custom-view-inside-a-scrollview.html”上看到了这个答案,解决了我的问题,即我的滚动视图中的文本视图在滚动期间总是产生一些小问题。我在网上搜索找到了这个答案,在这里给你投票。谢谢。 - Surely

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接