Эффективное рисование пути в Картах с более чем тысячами географических точек. - PullRequest
0 голосов
/ 26 июля 2011

Я использую MapActivity. Я беру набор GeoPoints с веб-сервера с использованием JSON и анализирую его для декодирования кода Polyline в гео-точки (широта и долгота), которые затем сохраняются в 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);; Может кто-нибудь мне помочь? Чтобы он работал быстро, даже если пользователь увеличил его вручную.

1 Ответ

4 голосов
/ 26 июля 2011

Первые две вещи, которые действительно бросаются в глаза, это 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);
    }
}
...