Можно ли увеличить размер "оверлея" вместе с картой Google на Android?
Мне удалось использовать "MapActivity" и "ItemizedOverlay", чтобы рисовать наложения на картах Google на Android с помощью Eclipse. Но когда карта увеличивается или уменьшается, наложение не меняет размер.
Я хочу, чтобы наложение было "зафиксировано" на карте, и увеличивать и уменьшать масштаб вместе с картой. Как это может быть сделано?
Я не могу найти учебник для определения границы (например, с GPS-координатами в качестве углов для наложенного изображения). Пожалуйста, предоставьте ссылки, если вы знаете некоторые.
и есть ли другие способы сделать это?
Большое спасибо.
2 ответа
Да, есть. У меня была такая же проблема с моим заявлением. Вот пример, и он работает отлично. Круг, нарисованный здесь, масштабируется при увеличении и уменьшении масштаба карты.
В вашем классе Overlay:
public class ImpactOverlay extends Overlay {
private static int CIRCLERADIUS = 0;
private GeoPoint geopoint;
public ImpactOverlay(GeoPoint point, int myRadius) {
geopoint = point;
CIRCLERADIUS = myRadius;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
// Transfrom geoposition to Point on canvas
Projection projection = mapView.getProjection();
Point point = new Point();
projection.toPixels(geopoint, point);
// the circle to mark the spot
Paint circle = new Paint();
circle.setColor(Color.BLACK);
int myCircleRadius = metersToRadius(CIRCLERADIUS, mapView, (double)geopoint.getLatitudeE6()/1000000);
canvas.drawCircle(point.x, point.y, myCircleRadius, circle);
}
public static int metersToRadius(float meters, MapView map, double latitude) {
return (int) (map.getProjection().metersToEquatorPixels(meters) * (1/ Math.cos(Math.toRadians(latitude))));
}
}
По мере того, как ваш оверлей будет перерисовываться из масштаба, размер маркера изменится вместе с ним в соответствии со шкалой метров ToRadius. Надеюсь, поможет.
Немного осмотревшись, я пришел к следующему ответу (я использовал код из этого блога для изменения размера).
Я переопределил тот же метод, который использовался выше, с некоторыми отличиями:
- Вместо метода drawCircle я использовал метод drawBitmap
- Я не использовал объект Paint
- Я перебрал элементы наложения, чтобы изменить размер маркеров
Это заканчивается так:
for(OverlayItem currentPoint:mOverlays){
geopoint =currentPoint.getPoint();
Point point = new Point();
projection.toPixels(geopoint, point);
BitmapDrawable bitDraw= ((BitmapDrawable)currentPoint.getMarker(0));
Drawable currentMarker = currentPoint.getMarker(0);
/*if (currentMarker!=null){
if (currentWidthRatio<.6f) {
currentWidthRatio = .6f;
}
else if (currentWidthRatio>1.5f) {
currentWidthRatio = 1.5f;
}
}*/
if (bitDraw!=null){
Bitmap bitmap = getResizedBitmap(bitDraw.getBitmap(),(int)(currentMarker.getIntrinsicHeight() * currentWidthRatio),
(int)(currentMarker.getIntrinsicWidth()*currentWidthRatio));
canvas.drawBitmap(bitmap,
point.x - bitmap.getHeight()/2,
point.y - bitmap.getWidth()/2, null);
}else{
Log.println(Log.DEBUG,"non-existent point", "");
}
}
Осторожнее, хотя! Метод currentPoint.getMarker(0) получает, как следует из его названия, данные текущего маркера. Это означает, что у вас есть его первоначальный размер, а не то, как он вырос (или уменьшился) с тех пор. Вы должны иметь какой-то метод, чтобы:
- сохранить оригинальный размер карты
- проверить, как это изменилось с тех пор (соотношение)
Код, который я закомментировал, обрабатывает максимальное и минимальное изменение размера, которое я хочу разрешить (чтобы маркеры могли быть видны без наложения / оставаться разборчивыми для человеческого глаза).
Надеюсь, это поможет!