MapView жүйесіндегі шеңберді (радиусты) сызуды сызу

Мен MapView-де шеңберді, яғни радиусты салуды қалаймын. Мен мұны ұнатамын:

Дөңгелекті жасау үшін қабаттастыру:

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 ішінде:

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

Мен MapActivity басталған кезде шеңберді көремін және ол мен ойлаған өлшемді, бірақ содан кейін экранның өлшеміне қарай жоғалады және жоғалады. Мұны қалай түзете аламын? Кез келген көмекті бағалайтын болады.

3
Ол өсіп келе жатқанда? Масштабтау деңгейін өзгерткенде немесе картаны жылжыту мүмкін бе?
қосылды автор Olegas, көзі

1 жауаптар

Сіз түсірген сайын, metersToEquatorPixels арқылы радиалды қайта есептеп отырсыз. Бұл есептеуді конструкторға жылжытуыңыз және мәселенің шешілгенін анықтауыңыз керек.

EDIT:

Олгас атап өткендей, проекция өзгеруі мүмкін. Сондықтан, сіз жасағыңыз келетін нәрсе, бастапқы радиус мәнін сіз сияқты сақтайды, содан кейін сызу әдісіңізде:

    float projectedRadius = projection.metersToEquatorPixels(radius);

және бұл мәнді ұтыс ойынында кейінірек пайдаланыңыз:

    canvas.drawCircle((float)point.x, (float)point.y, projectedRadius, paint);
3
қосылды
Мен бұрынғы радиус мәніне негізделген қайта есептеу радиусын сақтадым, яғни радиусты пиксельдермен алдым (алдыңғыDraw() қоңырауынан) және пикселдерде жаңа радиусты есептеуге тырыстым. Мені көрсеткеніңіз үшін рахмет.
қосылды автор Igor Filippov, көзі
Менің ойымша бұл дұрыс емес. «GetProjection» әдісі үшін javadoc: «Бұл объектке бір сызбадан көп уақыт кетпеу керек, себебі картаның проекциясы өзгеруі мүмкін».
қосылды автор Olegas, көзі
Жақсы нәрсе. Мен Olegas нүктесін көрсету үшін менің жауапымды редакциялап жатырмын
қосылды автор Craigy, көзі