0

我正在使用一个MapActivity. 我使用 JSON 从网络服务器获取一组 GeoPoints 并将其解析以将折线代码解码为地理点(纬度和经度),然后将其存储在ArrayList<Geopoints>.

然后将这些点绘制在MapActivity.

我的问题是,由于我的ArrayList<Geopoints>尺寸超过 2000,它运行效率不高。如何提高效率?

我在绘图时所做的示例代码是

ArrayList'<'Geopoints> mGeoPoints;

说大小mGeoPoints=2000;

在由 Overlay 扩展的类中。我写作的那个类的一些方法是。

public boolean draw(Canvas canvas, MapView mapView, boolean shadow,long when) {
       super.draw(canvas, mapView, shadow, when);
        drawPath(mapView, canvas);
        return true;
    }

public void drawPath(MapView mv, Canvas canvas) {
        int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
        Paint paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(3);
                for (int i = 0; i < mGeoPoints.size(); i++) {
            Point point = new Point();
            mv.getProjection().toPixels(mGeoPoints.get(i), point);
            x2 = point.x;
            y2 = point.y;
            if (i > 0) {
                canvas.drawLine(x1, y1, x2, y2, paint);
            }
            x1 = x2;
            y1 = y2;
        }
    }

这段代码工作正常。它在地图上正确绘制。当我缩放地图或移动地图应用程序时挂起。

我已将缩放级别设置为 16 mapController.setZoom(16);;谁能帮我?即使用户手动缩放它,也让它运行得很快。

4

1 回答 1

4

i < mGeoPoints.size();真正让我兴奋的前两件事是Point point = new Point();

您可以通过将数组的长度存储在局部变量中来优化这两者,并且更重要的是重用变量点。每次绘制循环创建一个新实例 2000 次会将您的手机锤成小块!

还要确保您的getProjection(...)方法重用传入的点。只要正确重置点值,您就可以使用以下内容:

Point point = new Point();

for (int i = 0; i < mGeoPoints.size(); i++) 
{
    mv.getProjection().toPixels(mGeoPoints.get(i), point);
    x2 = point.x;
    y2 = point.y;
    if (i > 0) 
    {
        canvas.drawLine(x1, y1, x2, y2, paint);
    }
}
于 2011-07-26T14:59:56.227 回答