2011-10-27 14 views
3

MapViewでサークル、つまり半径を描きたいと思います。 、MapActivityの起動時に、私はサークルを見て、それは私が意図したサイズですMapViewでサークル(半径)でオーバーレイを描く

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

:MapActivityで

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

} 

:円を描くように

オーバーレイ:私はこのようにそれを行いますしかしそれは画面のサイズに成長して消えます。これをどうやって解決するのですか? 助けていただければ幸いです。

+0

を、それが起動すると成長する?あなたがズームレベルを変更したり、マップを移動している可能性がありますか? – Olegas

答えて

3

あなたが描画するたびにmetersToEquatorPixelsを使用して半径を再計算しているようです。その計算をコンストラクターに移動して問題が解決するかどうかを確認する必要があります。

EDIT:

オルガが指摘したように、プロジェクションを変更することができます。

float projectedRadius = projection.metersToEquatorPixels(radius); 

をし、同様に引き分けに後でこの値を使用します:したがって、あなたは、あなたがそうであるように、あなたのdrawメソッドでは、その後、元 `半径値が格納されてやりたい

canvas.drawCircle((float)point.x, (float)point.y, projectedRadius, paint); 
+0

私はそれが間違っていると思います。 getProjectionメソッドのjavadocは、「マップの投影が変わる可能性があるので、複数の描画でこのオブジェクトを保持しないでください」と述べています。 – Olegas

+0

以前の半径値に基づいて半径を再計算していました。つまり、以前のonDraw()呼び出しからピクセル単位で半径をとり、新しい半径をピクセル単位で計算しようとしました。私を指してくれてありがとう。 –

+0

良い点。私はその点を反映するために私の応答を編集していますOlegas – Craigy