Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android地图圆形覆盖,动态改变半径?_Android_Maps - Fatal编程技术网

android地图圆形覆盖,动态改变半径?

android地图圆形覆盖,动态改变半径?,android,maps,Android,Maps,我在我的应用程序中有一个地图视图,我正在这张地图上画一些圆形覆盖图。一切正常,但当我缩放地图时,覆盖半径不会改变。我曾尝试在论坛和谷歌上搜索解决方案,但找不到一个适合我的。有人有什么想法吗 这是我的密码: HelloLogleMaps.java(主要活动) 提前感谢您的帮助 class myLocationOverlay extends com.google.android.maps.Overlay { private static final double defaultLatitu

我在我的应用程序中有一个地图视图,我正在这张地图上画一些圆形覆盖图。一切正常,但当我缩放地图时,覆盖半径不会改变。我曾尝试在论坛和谷歌上搜索解决方案,但找不到一个适合我的。有人有什么想法吗

这是我的密码:

HelloLogleMaps.java(主要活动)

提前感谢您的帮助

class myLocationOverlay extends com.google.android.maps.Overlay {

    private static final double defaultLatitude = Double.parseDouble("your_default_latitude");
    private static final double defaultLongitude = Double.parseDouble("your_default_longitude");
    private static final float defaultAccuracy = 250f; // or whatever you wish it to be


    Location currentLocation; // this should be already known

    private Paint accuracyPaint;
    private Point center;
    private Point left;
    private Drawable drawable;
    private int width;
    private int height;

    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
        super.draw(canvas, mapView, shadow);

        accuracyPaint = new Paint();
        accuracyPaint.setAntiAlias(true);
        accuracyPaint.setStrokeWidth(2.0f);

        drawable = mapView.getContext().getResources().getDrawable(R.drawable.my_location_dot);
        width = drawable.getIntrinsicWidth();
        height = drawable.getIntrinsicHeight();
        center = new Point();
        left = new Point();
        double latitude;
        double longitude;
        float accuracy;
        Projection projection = mapView.getProjection();

        if(currentLocation == null) {
            latitude = defaultLatitude;
            longitude = defaultLongitude;
            accuracy = defaultAccuracy;
        } else {
            latitude = currentLocation.getLatitude();
            longitude = currentLocation.getLongitude();
            accuracy = currentLocation.getAccuracy();
        }            

        float[] result = new float[1];

        Location.distanceBetween(latitude, longitude, latitude, longitude + 1, result);
        float longitudeLineDistance = result[0];

        GeoPoint leftGeo = new GeoPoint((int)(latitude * 1E6), (int)((longitude - accuracy / longitudeLineDistance) * 1E6));
        projection.toPixels(leftGeo, left);
        projection.toPixels(myLocationPoint, center);
        int radius = center.x - left.x;

        accuracyPaint.setColor(0xff6666ff);
        accuracyPaint.setStyle(Style.STROKE);
        canvas.drawCircle(center.x, center.y, radius, accuracyPaint);

        accuracyPaint.setColor(0x186666ff);
        accuracyPaint.setStyle(Style.FILL);
        canvas.drawCircle(center.x, center.y, radius, accuracyPaint);

        drawable.setBounds(center.x - width / 2, center.y - height / 2, center.x + width / 2, center.y + height / 2);
        drawable.draw(canvas);

        return true;
    }
}

将R.drawable.my_location\u dot更改为您使用的任何位置标记,并查看当前位置是已知的

我知道此线程已存在几个月,但总是有更简单的方法来实现非常类似的结果。 我知道,所提供的方法可以更精确地计算圆的大小,但是,如果您只需要计算某个区域周围的任何圆,则此代码需要更少的处理,从而使UI更流畅:

public class MapCircleOverlay extends Overlay {

private GeoPoint point;
private Paint paint1, paint2;

public MapCircleOverlay(GeoPoint point) {
    this.point = point;

    paint1 = new Paint();
    paint1.setARGB(128, 0, 0, 255);
    paint1.setStrokeWidth(2);
    paint1.setStrokeCap(Paint.Cap.ROUND);
    paint1.setAntiAlias(true);
    paint1.setDither(false);
    paint1.setStyle(Paint.Style.STROKE);

    paint2 = new Paint();
    paint2.setARGB(64, 0, 0, 255);  

}

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {

    Point pt = mapView.getProjection().toPixels(point, null);
    float radius = (float) Math.pow(2, mapView.getZoomLevel() - 10);

    if(radius < canvas.getHeight()/25){
        radius = canvas.getHeight()/25;
    }

    canvas.drawCircle(pt.x, pt.y, radius, paint2);
    canvas.drawCircle(pt.x, pt.y, radius, paint1);

}

}
公共类MapCircleOverlay扩展了覆盖{
专用地质点;
私人油漆1、油漆2;
公共地图圆形覆盖图(地质点){
这个点=点;
油漆1=新油漆();
paint1.setARGB(128,0,025);
油漆1.设置行程宽度(2);
油漆1.固定行程盖(油漆.盖.圆形);
paint1.setAntiAlias(真);
1.设置抖动(假);
paint1.setStyle(Paint.Style.STROKE);
油漆2=新油漆();
paint2.setARGB(64,0,025);
}
@凌驾
公共空白绘制(画布、地图视图、地图视图、布尔阴影){
Point pt=mapView.getProjection().toPixels(点,null);
浮点半径=(float)Math.pow(2,mapView.getZoomLevel()-10);
if(半径
说明: 文档说明,对于每个zoomLevel,地图的大小都会加倍(或减半),因此只要半径加倍或减半,其大小在整个图形中都会保持一致

可以更改“-10”以改变圆的大小(如果需要,可以在构造函数中完成)

此外,可以根据需要调整min_r(最小半径)计算,这只是为了防止用户缩小时圆完全消失

希望它能帮助别人;)


我修改了Bundius的答案,因此它可以与仪表一起工作,您可以将其作为构造函数的一部分输入。

对不起,我知道被接受的答案很旧,但存在一个本机更好的解决方案

 // Add a circle in Sydney
 Circle circle = map.addCircle(new CircleOptions()
     .center(new LatLng(-33.87365, 151.20689))
     .radius(10000)
     .strokeColor(Color.RED)
     .fillColor(Color.BLUE));
我希望这对某人有帮助()


参考资料:

将半径添加到屏幕后,您将如何更改半径?
public class MapCircleOverlay extends Overlay {

private GeoPoint point;
private Paint paint1, paint2;

public MapCircleOverlay(GeoPoint point) {
    this.point = point;

    paint1 = new Paint();
    paint1.setARGB(128, 0, 0, 255);
    paint1.setStrokeWidth(2);
    paint1.setStrokeCap(Paint.Cap.ROUND);
    paint1.setAntiAlias(true);
    paint1.setDither(false);
    paint1.setStyle(Paint.Style.STROKE);

    paint2 = new Paint();
    paint2.setARGB(64, 0, 0, 255);  

}

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {

    Point pt = mapView.getProjection().toPixels(point, null);
    float radius = (float) Math.pow(2, mapView.getZoomLevel() - 10);

    if(radius < canvas.getHeight()/25){
        radius = canvas.getHeight()/25;
    }

    canvas.drawCircle(pt.x, pt.y, radius, paint2);
    canvas.drawCircle(pt.x, pt.y, radius, paint1);

}

}
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class MapCircleOverlay extends Overlay {

private GeoPoint point;
private Paint paint1, paint2;
private float radius; //in meters

public MapCircleOverlay(GeoPoint point, float radius) {
    this.point = point;

    paint1 = new Paint();
    paint1.setARGB(128, 0, 0, 255);
    paint1.setStrokeWidth(2);
    paint1.setStrokeCap(Paint.Cap.ROUND);
    paint1.setAntiAlias(true);
    paint1.setDither(false);
    paint1.setStyle(Paint.Style.STROKE);

    paint2 = new Paint();
    paint2.setARGB(64, 0, 0, 255);

    this.radius = radius;
}

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {

    Point pt = mapView.getProjection().toPixels(point, null);
    float projectedRadius = mapView.getProjection().metersToEquatorPixels(radius);

    canvas.drawCircle(pt.x, pt.y, projectedRadius, paint2);
    canvas.drawCircle(pt.x, pt.y, projectedRadius, paint1);

}

}
 // Add a circle in Sydney
 Circle circle = map.addCircle(new CircleOptions()
     .center(new LatLng(-33.87365, 151.20689))
     .radius(10000)
     .strokeColor(Color.RED)
     .fillColor(Color.BLUE));
private CircleOptions circle;
double radiusInMeters = 50.0;
int strokeColor = 0xffff0000; //red outline
int shadeColor = 0x44ff0000;

 @Override
 public void onLocationChanged(Location location) {

 ...
    LatLng mylatlng= new LatLng(currentLat, currentLon);
    circle = new CircleOptions().center(mylatlng).radius(radiusInMeters).fillColor(shadeColor).strokeColor(strokeColor).strokeWidth(3);
    mMap.addCircle(circle);

 ...

}