MapView'da bindirme (yarıçap) ile çizim kaplaması

MapView'de, yani yarıçapında bir daire çizmek istiyorum. Böyle yapıyorum:

Çevre çizme yerleşimi:

public class RadiusOverlay extends Overlay {

    private Context context;
    private double latitude;
    private double longitude;
    private float radius;

    public RadiusOverlay(Context context, double latitude, double longitude, float radius){
     /*.....................*/
    }

    public void draw(Canvas canvas, MapView mapView, boolean shadow){
        super.draw(canvas, mapView, shadow); 

        Point point = new Point();
        GeoPoint geoPoint = new GeoPoint((int) (latitude *1e6), (int)(longitude * 1e6));

        Projection projection = mapView.getProjection();
        projection.toPixels(geoPoint, point);
        radius = projection.metersToEquatorPixels(radius);

        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setARGB(100, 100, 100, 100);

        canvas.drawCircle((float)point.x, (float)point.y, radius, paint);
    }

}

MapActivity'de:

List mapOverlays = mapView.getOverlays();
RadiusOverlay radiusOverlay = new RadiusOverlay(this, latitude, longitude, radius);
mapOverlays.add(radiusOverlay);

MapActivity başladığında daireyi görüyorum ve bu benim hedeflediğim boyut, ancak daha sonra ekran boyutuna büyüyor ve kayboluyor. Bunu nasıl düzeltebilirim? Herhangi bir yardım takdir edecektir.

3
Büyümeye başladığında? Size zoom seviyesini değiştirdiğinizde veya bir harita taşımak olabilir?
katma yazar Olegas, kaynak

1 cevap

Her çizişinizde metersToEquatorPixels kullanarak yarıçapı yeniden hesaplıyor gibisiniz. Bu hesaplamayı yapıcıya taşımalı ve bunun probleminizi çözüp çözmediğini görmelisiniz.

DÜZENLE:

Olgas'ın işaret ettiği gibi, Projeksiyon değişebilir. Bu nedenle, yapmak istediğiniz orijinal yarıçap değerini olduğu gibi saklamak, sonra çizim yönteminizde yapmaktır:

    float projectedRadius = projection.metersToEquatorPixels(radius);

ve bu değeri daha sonra çizimde kullanın:

    canvas.drawCircle((float)point.x, (float)point.y, projectedRadius, paint);
3
katma
Önceki yarıçap değerini temel alarak yeniden hesaplama yarıçapını koruyordum, yani pikselleri yarıçap (önceki onDraw() çağrısından) aldım ve pikselleri yeni yarıçapı hesaplamaya çalıştım. Beni işaret ettiğin için teşekkürler.
katma yazar Igor Filippov, kaynak
Bence yanlış. GetProjection yönteminin javadoc'u "Bu nesneye birden fazla çizim için tutmamalısınız, çünkü haritanın yansıması değişebilir" diyor.
katma yazar Olegas, kaynak
İyi bir nokta. Bu noktayı yansıtmak için cevabımı düzenliyorum.
katma yazar Craigy, kaynak