在我的位置周围绘制圆圈

时间:2012-05-11 12:18:44

标签: android geolocation geometry ondraw

我想绕着我的位置划一圈。我不确定我做错了什么,但圈子没有显示:

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Projection projection = mapView.getProjection();

    if (shadow == false && location != null) {
        // Get the current location
        Double latitude = location.getLatitude() * 1E6;
        Double longitude = location.getLongitude() * 1E6;
        GeoPoint geoPoint = new GeoPoint(latitude.intValue(),
                longitude.intValue());

        int radius = metersToRadius(100, mapView, latitude);

        // Convert the location to screen pixels
        Point point = new Point();
        projection.toPixels(geoPoint, point);

        // Setup the paint
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(2.0f);

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

        paint.setColor(0x186666ff);
        paint.setStyle(Style.FILL);
        canvas.drawCircle(point.x, point.y, radius, paint);
    }
    super.draw(canvas, mapView, shadow);
}

编辑:为了明确我要发布我的课程: CustomItemizedOverlay

public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {

protected final List<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

protected final Context mContext;

public CustomItemizedOverlay(Drawable defaultMarker, Context context) {
    super(boundCenterBottom(defaultMarker));
    this.mContext = context;
}

public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
}

@Override
protected OverlayItem createItem(int i) {
    // TODO Auto-generated method stub
    return mOverlays.get(i);
}

public void removeOverlay(OverlayItem overlay) {
    mOverlays.remove(overlay);
    populate();
}

public void clear() {
    mOverlays.clear();
    populate();
}

@Override
public int size() {
    // TODO Auto-generated method stub
    return mOverlays.size();
}

@Override
protected boolean onTap(int i) {
    OverlayItem itemClicked = this.mOverlays.get(i);

    AlertDialog.Builder builder = new AlertDialog.Builder(this.mContext);

    builder.setTitle(itemClicked.getTitle());
    builder.setMessage(itemClicked.getSnippet());
    builder.setCancelable(true);

    AlertDialog alert = builder.create();
    alert.show();

    return true;
}

和PcCustomizedOverlay

public class PcCustomItemizedOverlay extends CustomItemizedOverlay {

public static int metersToRadius(float meters, MapView map, double latitude) {
    return (int) (map.getProjection().metersToEquatorPixels(meters) * (1 / Math
            .cos(Math.toRadians(latitude))));
}

private Location location;

public PcCustomItemizedOverlay(Drawable defaultMarker, Context context) {
    super(defaultMarker, context);
}

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Projection projection = mapView.getProjection();

    if (shadow == false && location != null) {
        // Get the current location
        Double latitude = location.getLatitude() * 1E6;
        Double longitude = location.getLongitude() * 1E6;
        GeoPoint geoPoint = new GeoPoint(latitude.intValue(),
                longitude.intValue());

        int radius = metersToRadius(40, mapView, latitude);

        // Convert the location to screen pixels
        Point point = new Point();
        projection.toPixels(geoPoint, point);

        // Setup the paint
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(2.0f);

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

        paint.setColor(0x186666ff);
        paint.setStyle(Style.FILL);
        canvas.drawCircle(point.x, point.y, radius, paint);
    }
    super.draw(canvas, mapView, shadow);
}

public Location getLocation() {
    return location;
}

public void setLocation(Location location) {
    this.location = location;
}

}

有谁知道问题出在哪里?

非常感谢

3 个答案:

答案 0 :(得分:3)

试试这段代码

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mapView = (MapView) findViewById(R.id.mapview);
    MapController mc = mapView.getController();
    MyLocationOverlay myLocationOverlay = new MyLocationOverlay(MainMap.this, mapView);
    mapView.getOverlays().add(myLocationOverlay);
    mc.animateTo( new GeoPoint(lat, lng));
    mc.setZoom(15);
    mapView.invalidate();
}

别忘了添加overlay.enableMyLocation();在onresume()和overlay.disableMyLocation();在暂停

如果你想在你周围绘制圆圈而不是上面的代码,你可以使用下面的示例代码:

Point screenPnts =new Point();
GeoPoint curr_geopoint = new GeoPoint((int)(location.getLatitude()*1E6),(int)(location.getLongitude()*1E6));
mapview.getProjection().toPixels(curr_geopoint, screenPnts);
canvas.drawCircle(screenPnts.x, screenPnts.y, 15, paint);

做一些试验&amp;通过操作screenPnts.x和screenPnts.y值来获取该点周围的错误。这里paint是Paint类的对象,用于给圆圈赋予颜色

答案 1 :(得分:1)

我认为void draw中存在问题。

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    super.draw(canvas, mapView, shadow);
   Projection projection = mapView.getProjection();

    if (shadow == false && location != null) {
        // Get the current location
        Double latitude = location.getLatitude() * 1E6;
        Double longitude = location.getLongitude() * 1E6;
        GeoPoint geoPoint = new GeoPoint(latitude.intValue(),
                longitude.intValue());

        int radius = metersToRadius(100, mapView, latitude);

        // Convert the location to screen pixels
        Point point = new Point();
        projection.toPixels(geoPoint, point);

        // Setup the paint
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(2.0f);

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

        paint.setColor(0x186666ff);
        paint.setStyle(Style.FILL);
        canvas.drawCircle(point.x, point.y, radius, paint);
    }

}

此处也可以查看地图上的图片。drawing image as mapoverlay

答案 2 :(得分:0)

我遇到过类似的问题。

使用覆盖布尔绘制解决它,而不是扩展Overlay的内部类中的void。

看起来像这样:

 //inner class MapOverlay
class MapOverlay extends com.google.android.maps.Overlay
{
    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) 
    {
        super.draw(canvas, mapView, shadow);                   

        Projection projection = mapView.getProjection();

        //the rest of your code here................

        super.draw(canvas,mapView,shadow);

        return true;
    }
}

使用

构建您的圈子
MapOverlay mapOverlayCircle = new MapOverlay();

并将其添加到mapView中的Overlays中。就是这样。