首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scrollview优化

Scrollview优化
EN

Stack Overflow用户
提问于 2011-04-07 05:28:18
回答 3查看 5K关注 0票数 7

我有一个包含自定义视图的滚动视图。自定义视图大于屏幕区域并正确绘制。

然而,滚动视图倾向于在滚动时不停地调用onDraw(),而且我似乎无法使其流畅。

我使用ScrollView.getDrawingRect()计算屏幕的可见部分并仅绘制到该部分,但它仍然返回整个视区(因此它被优化为不绘制屏幕外区域),而不是最后一个位置和当前位置之间的增量。理想情况下,我只想绘制增量,而不是整个可见窗口。

如果有人能告诉我更多关于如何使用绘图缓存的信息,如果这有助于优化滚动,我将很乐意实现它,或任何其他可能的解决方案,将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-07 05:36:25

滚动内容时,需要重新绘制整个视口,因为所有内容都已移动。我不认为需要做任何事情来优化ScrollView -如果滚动很慢,那么是自定义视图的绘制方法太慢了。

尽量避免在绘图方法中创建对象,这通常是导致绘图性能不佳的主要原因。

编辑: scrollview还可以快速地将仍然绘制在屏幕上的旧内容上下移动,然后请求仅重绘屏幕的“新”部分。(仅适用于不透明视图)。

票数 5
EN

Stack Overflow用户

发布于 2013-03-04 20:56:28

我遇到了同样的问题。我使用函数setDrawingCacheEnabled(true)解决了这个问题。通过启用此设置,您的画布视图将被缓存为位图,因此您不必在每次调用onDraw()时都调用canvas的draw方法。

在您的自定义视图的构造函数中,您将需要如下内容:

代码语言:javascript
复制
public CustomView(Context context) {
    setDrawingCacheEnabled(true);
    drawnFlag = false;
}

在您的onDraw方法中,您将需要如下内容:

代码语言:javascript
复制
public void onDraw(Canvas canvas) {
    if (! drawnFlag) {
        canvas.drawPath(...);
        canvas.drawPath(...);
        drawnFlag = true;
    }
}

现在,在这个自定义视图上滚动应该是平滑的,因为我们只调用绘制方法一次。

票数 2
EN

Stack Overflow用户

发布于 2012-11-03 22:26:40

ScrollView在你的视图在onDraw中得到的画布上设置了一个合适的矩形裁剪,所以你只需要绘制矩形里面的内容。您还可以基于剪辑矩形的大小实现缓存位图。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5573183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档