2011-10-27 2 views
3

MapView에 원 (즉, 반지름)을 그려야합니다. 나는 이런 식으로 작업을 수행합니다 MapActivity에서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); 
    } 

} 

:

오버레이가 원을 그릴

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

MapActivity를 시작할 때 내가 원을보고, 그것이 내가 의도 한 크기의, 그러나 화면의 크기로 커지고 사라집니다. 이 문제를 어떻게 해결할 수 있습니까? 도움을 주셔서 감사합니다.

+0

을 시작할 때 자라고? 확대/축소 수준을 변경하거나지도를 이동할 수 있습니까? – Olegas

답변

3

그릴 때마다 metersToEquatorPixels을 사용하여 반경을 다시 계산하는 것처럼 보입니다. 해당 계산을 생성자로 이동하여 문제가 해결되는지 확인해야합니다.

편집 :

올가가 지적한 바와 같이, 프로젝션은 변경할 수 있습니다.

float projectedRadius = projection.metersToEquatorPixels(radius); 

을뿐만 아니라 무승부 이후에이 값을 사용 : 따라서 당신은 당신이로 그리기 방법 다음, 원래`반경 값을 저장되어하고 싶은 일을 할

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

나는 그것이 잘못되었다고 생각한다. getProjection 메소드의 javadoc은 "지도의 투영이 변경 될 수 있기 때문에 둘 이상의 그리기에 대해이 객체를 고정해서는 안됩니다."라고 말합니다. – Olegas

+0

이전 반경 값을 기준으로 반경을 다시 계산했습니다. 즉, 이전 반경 (onDraw() 호출에서 반경을 픽셀로 가져 와서 새로운 반경을 픽셀로 계산하려고했습니다. 나를 가리켜 주셔서 감사합니다. –

+0

좋은 지적. 나는 그 점을 반영하기 위해 나의 반응을 편집하고있다 Olegas – Craigy