在MapView上绘制带有圆形(半径)的叠加层

3

我想在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<Overlay> mapOverlays = mapView.getOverlays();
RadiusOverlay radiusOverlay = new RadiusOverlay(this, latitude, longitude, radius);
mapOverlays.add(radiusOverlay);

当MapActivity启动时,我看到一个圆形,它的大小和我想要的一样,但然后它变大到屏幕的大小并消失了。我该如何解决这个问题?非常感谢帮助。

它是在什么时候开始增长的?当您更改缩放级别或移动地图时吗? - Olegas
1个回答

3
看起来您每次绘制时都在使用 metersToEquatorPixels 重新计算半径。建议您将该计算移到构造函数中,看看是否可以解决问题。
编辑:
正如 Olgas 指出的那样,投影方式可能会发生改变。因此,您需要像之前一样存储原始的半径值,然后在绘制方法中执行以下操作:
    float projectedRadius = projection.metersToEquatorPixels(radius);

并且稍后在绘图中也要使用这个值:

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

我认为这是错误的。getProjection方法的javadoc说:“您不应该在一次绘制之后保留此对象,因为地图的投影可能会更改。” - Olegas
我一直在根据先前的半径值重新计算半径,即我使用像素中的半径(从上一个onDraw()调用中)并尝试计算新的像素半径。感谢您指出这一点。 - user468311
好的观点。我正在编辑我的回复以反映Olegas的观点。 - skynet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接