Desenarea suprafeței cu cerc (rază) pe MapView

Vreau să desenez un cerc pe MapView, adică o rază. Eu fac asta asa:

Suprapunere pentru a desena cerc:

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

}

În MapActivity:

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

Văd cercul atunci când începe activitatea MapActivity și este dimensiunea pe care am intenționat-o, dar apoi crește până la dimensiunea ecranului și dispare. Cum pot rezolva asta? Va aprecia orice ajutor.

3
Când începe să crească? Când vă schimbați nivelul de mărire sau puteți muta o hartă?
adăugat autor Olegas, sursa

1 răspunsuri

Se pare că re-calculați raza utilizând metersToEquatorPixels de fiecare dată când o desenați. Ar trebui să mutați acel calcul la constructor și să vedeți dacă acesta vă rezolvă problema.

EDITAȚI | ×:

După cum a subliniat Olgas, proiecția se poate schimba. Prin urmare, ceea ce vrei să faci este să păstrezi valoarea originală a razei așa cum ești, apoi, în metoda ta de desen, fa:

    float projectedRadius = projection.metersToEquatorPixels(radius);

și folosiți această valoare mai târziu în tragere la sorți:

    canvas.drawCircle((float)point.x, (float)point.y, projectedRadius, paint);
3
adăugat
Păstrez o rază de recalculare bazată pe o valoare de rază anterioară, adică mi-am luat raza în pixeli (de la apelul precedent peDraw ()) și am încercat să calculez o nouă rază în pixeli. Mulțumesc pentru că m-ai arătat.
adăugat autor Igor Filippov, sursa
Cred că este greșit. Metoda javadoc pentru metoda getProjection spune: "Nu trebuie să vă mențineți acest obiect pentru mai mult de o remiză, deoarece proiecția hărții se poate schimba".
adăugat autor Olegas, sursa
Buna observatie. Editrez răspunsul meu pentru a reflecta acel punct Olegas
adăugat autor Craigy, sursa
Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md