Можно ли увеличить размер "оверлея" вместе с картой Google на Android? - PullRequest
9 голосов
/ 06 июля 2011

Мне удалось использовать «MapActivity» и «ItemizedOverlay», чтобы рисовать наложения на картах Google на Android с помощью Eclipse.Но когда карта увеличивается или уменьшается, наложение не меняет размер.

Я хочу, чтобы наложение было «фиксированным» на карте и увеличивало и уменьшало масштаб вместе с картой.Как это можно сделать?

Я не могу найти учебник для определения границы (например, с GPS-координатами в качестве углов для наложенного изображения).Пожалуйста, предоставьте ссылки, если вы знаете некоторые из них.

и любые другие способы сделать это?

Большое спасибо.

Ответы [ 2 ]

7 голосов
/ 23 августа 2011

Да, есть.У меня была такая же проблема с моим заявлением.Вот пример, и он работает отлично.Круг, нарисованный здесь, масштабируется при увеличении и уменьшении масштаба карты.

В вашем классе наложения:

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.Надеюсь, это поможет.

0 голосов
/ 17 апреля 2012

После небольшого осмотра я придумал следующий ответ (для изменения размера я использовал код из этого блога ).

Я перебил тот же метод, что и выше, с некоторыми отличиями:

  • Вместо метода 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) получает, как следует из его названия, данные текущего маркера. Это означает, что у вас есть его оригинальный размер, а не то, как он вырос (или уменьшился) с тех пор. Вы должны иметь какой-то метод:

  • хранить оригинальный размер карты
  • проверить, как оно изменилось с (соотношение)

Код, который я закомментировал, обрабатывает максимальное и минимальное изменение размера, которое я хочу разрешить (чтобы маркеры были видны без наложения / оставались разборчивыми для человеческого глаза).

Надеюсь, это поможет!

...