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 を使用して半径を再計算しているようです。その計算をコンストラクターに移動して問題が解決するかどうかを確認する必要があります。

編集:

Olgasが指摘しているように、投影は変化する可能性があります。したがって、あなたがしたいことは、元の `radius値をあなたのままにしておいてから、drawメソッドで次のようにします:

    float projectedRadius = projection.metersToEquatorPixels(radius);

この値を描画の後半でも使用します。

    canvas.drawCircle((float)point.x, (float)point.y, projectedRadius, paint);
3
追加された
以前の半径値に基づいて半径を再計算していました。つまり、以前のonDraw()呼び出しからピクセル単位で半径をとり、新しい半径をピクセル単位で計算しようとしました。私を指してくれてありがとう。
追加された 著者 Igor Filippov,
私はそれが間違っていると思う。 getProjectionメソッドのjavadocは、「マップの投影が変わる可能性があるので、複数の描画でこのオブジェクトを保持するべきではない」と述べています。
追加された 著者 Olegas,
いい視点ね。私はその点を反映するために私の応答を編集していますOlegas
追加された 著者 Craigy,