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