#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. Хорошо, это действительно очень помогает. Большое спасибо!