我有一个包含自定义视图的滚动视图。自定义视图大于屏幕区域并正确绘制。
然而,滚动视图倾向于在滚动时不停地调用onDraw(),而且我似乎无法使其流畅。
我使用ScrollView.getDrawingRect()计算屏幕的可见部分并仅绘制到该部分,但它仍然返回整个视区(因此它被优化为不绘制屏幕外区域),而不是最后一个位置和当前位置之间的增量。理想情况下,我只想绘制增量,而不是整个可见窗口。
如果有人能告诉我更多关于如何使用绘图缓存的信息,如果这有助于优化滚动,我将很乐意实现它,或任何其他可能的解决方案,将不胜感激。
发布于 2011-04-07 05:36:25
滚动内容时,需要重新绘制整个视口,因为所有内容都已移动。我不认为需要做任何事情来优化ScrollView -如果滚动很慢,那么是自定义视图的绘制方法太慢了。
尽量避免在绘图方法中创建对象,这通常是导致绘图性能不佳的主要原因。
编辑: scrollview还可以快速地将仍然绘制在屏幕上的旧内容上下移动,然后请求仅重绘屏幕的“新”部分。(仅适用于不透明视图)。
发布于 2013-03-04 20:56:28
我遇到了同样的问题。我使用函数setDrawingCacheEnabled(true)解决了这个问题。通过启用此设置,您的画布视图将被缓存为位图,因此您不必在每次调用onDraw()时都调用canvas的draw方法。
在您的自定义视图的构造函数中,您将需要如下内容:
public CustomView(Context context) {
setDrawingCacheEnabled(true);
drawnFlag = false;
}在您的onDraw方法中,您将需要如下内容:
public void onDraw(Canvas canvas) {
if (! drawnFlag) {
canvas.drawPath(...);
canvas.drawPath(...);
drawnFlag = true;
}
}现在,在这个自定义视图上滚动应该是平滑的,因为我们只调用绘制方法一次。
发布于 2012-11-03 22:26:40
ScrollView在你的视图在onDraw中得到的画布上设置了一个合适的矩形裁剪,所以你只需要绘制矩形里面的内容。您还可以基于剪辑矩形的大小实现缓存位图。
https://stackoverflow.com/questions/5573183
复制相似问题