我有一个包含自定义视图的滚动视图。自定义视图大于屏幕区域并正确绘制。
滚动视图往往会在滚动时不停地调用onDraw(),而我似乎无法使其平滑。
我使用ScrollView.getDrawingRect()来计算屏幕的可见部分并且只绘制到那个,但它仍然返回整个视口(因此它被优化为不绘制屏幕外区域),而不是最后位置之间的增量和现在的。理想情况下,我只想绘制delta,而不是整个可见窗口。
如果有人可以向我指出有关如何使用绘图缓存的更多信息,并且如果这将有助于优化滚动,我很乐意实现它,或者任何其他可能的解决方案,我们将非常感激。
答案 0 :(得分:5)
滚动内容时,需要重新绘制整个视口,因为所有内容都已移动。我不认为优化ScrollView
需要做任何事情 - 如果滚动速度慢,那么自定义视图的绘制方法太慢了。
尽量避免在绘图方法中创建对象,这通常是绘图性能不佳的主要原因。
编辑:此外,滚动视图可以快速向上或向下快速显示仍然在屏幕上绘制的旧内容,然后请求仅重绘屏幕的“新”部分。 (仅适用于不透明视图)。
答案 1 :(得分:2)
我遇到了同样的问题。我使用函数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;
}
}
现在,滚动此自定义视图应该是平滑的,因为我们只调用一次绘图方法。
答案 2 :(得分:-1)
Afaik ScrollView在你的视图进入onDraw的画布上设置一个正确的剪辑矩形,这样你只需要画出那个矩形内的东西。 您还可以根据剪辑rect的大小实现缓存位图。