Overlay tekenen met cirkel (straal) op MapView

Ik wil een cirkel tekenen op MapView, d.w.z. straal. Ik doe het als volgt:

Overlay om cirkel te tekenen:

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);
    }

}

In MapActivity:

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

Ik zie cirkel wanneer MapActivity begint, en het is de grootte die ik had bedoeld, maar dan groeit het uit tot de grootte van het scherm en verdwijnt het. Hoe los ik dit op? Zal elke hulp waarderen.

3
Wanneer begint het te groeien? Wanneer u uw zoomniveau wijzigt of een kaart verplaatst?
toegevoegd de auteur Olegas, de bron

1 antwoord

Het lijkt erop dat u de radius opnieuw berekent met metersToEquatorPixels elke keer dat u het tekent. U moet die berekening naar de constructor verplaatsen en kijken of daarmee uw probleem is opgelost.

BEWERK:

Zoals Olgas opmerkte, kan de projectie veranderen. Dus wat je wilt doen is de originele `radiuswaarde opslaan zoals je bent, dan in je tekenmethode:

    float projectedRadius = projection.metersToEquatorPixels(radius);

en gebruik deze waarde later ook in de trekking:

    canvas.drawCircle((float)point.x, (float)point.y, projectedRadius, paint);
3
toegevoegd
Ik hield de herberekening van de straal op basis van de vorige radiuswaarde, d.w.z. ik nam de straal in pixels (van de vorige onDraw() -aanroep) en probeerde de nieuwe straal in pixels te berekenen. Bedankt dat je me wees.
toegevoegd de auteur Igor Filippov, de bron
Ik denk dat het verkeerd is. De javadoc voor getProjection-methode zegt: "Je moet dit object niet vasthouden voor meer dan één trekking, omdat de projectie van de kaart zou kunnen veranderen."
toegevoegd de auteur Olegas, de bron
Goed punt. Ik ben mijn antwoord aan het bewerken om dat punt Olegas weer te geven
toegevoegd de auteur Craigy, de bron