2011-04-06 25 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