Динамическое рисование линий между несколькими географическими точками в Android MapView

#android #line #android-mapview

#Android #линия #android-mapview

Вопрос:

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

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

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

Заранее благодарю вас.

Комментарии:

1. Как вы думаете, почему вам нужно жестко кодировать географические точки?

Ответ №1:

Используйте Projection из MapView , чтобы преобразовать географические точки в «экранные» точки. После этого вы можете использовать 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);
    }
}
 

Комментарии:

1. Хорошо, это действительно очень помогает. Большое спасибо!