Динамически рисовать линии между несколькими GeoPoints в Android MapView - PullRequest
0 голосов
/ 31 октября 2011

Я разрабатываю приложение, которое имеет несколько пользовательских наложений на MapView, представляющих суда. При выборе судна я показываю его предыдущие позиции на карте, опять же с пользовательскими элементами наложения, и я хотел бы соединить их линией.

Некоторые соответствующие проблемы, которые я видел здесь, были решены путем переопределения метода Draw и жесткого кодирования координат GeoPoints в методе Draw. Это мне совсем не помогает, так как у меня много очков с разных кораблей, и я не могу жестко закодировать их все в Draw.

Есть ли простой способ нарисовать линию между GeoPoints внутри цикла for, используемого для отображения пользовательских оверлеев ??

Заранее спасибо.

1 Ответ

2 голосов
/ 31 октября 2011

Используйте Projection из MapView для преобразования GeoPoints в «экранные» точки. После этого вы можете использовать Path, чтобы нарисовать желаемую линию. Первая точка должна быть указана с помощью path.moveTo(x, y), а остальная - с помощью path.lineTo(x, y). В конце вы звоните canvas.drawPath(path) и все готово.

Ниже приведен код из моего метода draw (), который рисует многоугольник вокруг набора точек. Обратите внимание, что вам не нужно использовать path.close(), как я использовал в своем коде.

public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow){
    if(shadow){
        if(isDrawing == false){
            return;
        }
        Projection proj = mapView.getProjection();

        boolean first = true;
        /*Clear the old path at first*/
        path.rewind();
        /* The first tap */
        Paint circlePaint = new Paint();
        Point tempPoint = new Point();
        for(GeoPoint point: polygon){
            proj.toPixels(point, tempPoint);
            if(first){
                path.moveTo(tempPoint.x, tempPoint.y);
                first = false;
                circlePaint.setARGB(100, 255, 117, 0);
                circlePaint.setAntiAlias(true);
                canvas.drawCircle(tempPoint.x, tempPoint.y, FIRST_CIRCLE_RADIOUS, circlePaint);
            }
            else{
                path.lineTo(tempPoint.x, tempPoint.y);
                circlePaint.setARGB(100, 235, 0, 235);
                circlePaint.setAntiAlias(true);
                canvas.drawCircle(tempPoint.x, tempPoint.y, CIRCLE_RADIOUS, circlePaint);
            }
        }
        /* If indeed is a polygon just close the perimeter */
        if(polygon.size() > 2){
            path.close();
        }
        canvas.drawPath(path, polygonPaint);
        super.draw(canvas, mapView, shadow);
    }
}
...