如何避免在onDraw上花费很长时间?

时间:2014-12-14 08:52:21

标签: android bitmap android-canvas android-view ondraw

我正在编写一个应用程序来绘制一些数据(地铁数据的地图),并且当用户触摸屏幕时可以移动/缩放地图。 现在我使用View绘制地图,当onDraw(Canvas canvas)调用时,地图正在Canvas中绘制。

我计算翻译x / y并在调用onTouchEvent时进行缩放,然后调用invalidate()刷新地图。 onDraw方法如下所示:

@Override
protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas.translate(nowPosX, nowPosY);
    canvas.scale(mScaleFactor, mScaleFactor);
    canvas.drawColor(Color.WHITE);

    for (Subways.Line line : subwayData.getLineList()) {
        for (Subways.Line.Stations:line.getStationList) {
            canvas.drawLine();
            canvas.drawText();
            canvas.drawCircle();
        }
    }

    canvas.restore();
    super.onDraw(canvas);
}

但我现在有问题。每次我移动/缩放地图时,我都需要重新绘制所有内容,数据是如此之多并花费大量时间。当我移动/缩放地图时它会变慢。

我首先尝试在Bitmap中绘制并在每次onDraw调用时移动/缩放位图。但是如果位图很小,那么当我缩放时它会看起来很模糊。如果位图很大,可能会导致OutOfMemoryError

有什么方法可以解决我的问题吗?

2 个答案:

答案 0 :(得分:1)

在一些较旧的Android版本上,您可以通过一次性绘制所有位图和一次性所有文本来提高性能。其他可能性是为每个文本创建一个路径,缓存它们并使用缓存在每次需要重绘时绘制路径。

答案 1 :(得分:1)

在将地图显示到屏幕之前,您可以使用线条,圆圈和在其上绘制的文本准备地图到许多位图中。

然后修改onDraw()方法,使其仅以正确的比例绘制某些细分位图。