在地图上创build自定义叠加层

我试图在Android中复制Maps的这个function: 自定义地图叠加

你可以看到在地图上有一个Circle描述了用户select的范围。

在我的应用程序中,我还想要一个拖动器驻留在圆的圆周上,可以拖动它来重新定义圆弧。

如果有人能告诉我如何在地图上绘制自定义的可绘制覆盖图和2Dgraphics,我可以自己做其他事情。

谢谢!

完整的应用程序可以在这个链接

Solutions Collecting From Web of "在地图上创build自定义叠加层"

好吧,我试着自己做事情,并把这个代码得到上述的效果:

public class MarkerOverlay extends Overlay { Geocoder geoCoder = null; public MarkerOverlay() { super(); } @Override public boolean onTap(GeoPoint geoPoint, MapView mapView){ selectedLatitude = geoPoint.getLatitudeE6(); selectedLongitude = geoPoint.getLongitudeE6(); return super.onTap(geoPoint,mapView); } @Override public void draw(Canvas canvas, MapView mapV, boolean shadow){ if(shadow){ Projection projection = mapV.getProjection(); Point pt = new Point(); projection.toPixels(globalGeoPoint,pt); GeoPoint newGeos = new GeoPoint(selectedLat+(100),selectedLong); // adjust your radius accordingly Point pt2 = new Point(); projection.toPixels(newGeos,pt2); float circleRadius = Math.abs(pt2.y-pt.y); Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); circlePaint.setColor(0x30000000); circlePaint.setStyle(Style.FILL_AND_STROKE); canvas.drawCircle((float)pt.x, (float)pt.y, circleRadius, circlePaint); circlePaint.setColor(0x99000000); circlePaint.setStyle(Style.STROKE); canvas.drawCircle((float)pt.x, (float)pt.y, circleRadius, circlePaint); Bitmap markerBitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(),R.drawable.pin); canvas.drawBitmap(markerBitmap,pt.x,pt.y-markerBitmap.getHeight(),null); super.draw(canvas,mapV,shadow); } } } 

这让我有以下效果:

对地图的影响

所用的计算可能不是你想要的。
它只是为了演示的目的。
实际距离计算也需要使用轴承,并有一些具体的公式。
如果您对此有任何疑问,请告诉我。

扩展类ItemizedOverlay以覆盖draw()方法。 将绘制覆盖图的Canvas传递给该方法,您可以调用drawCircle或任何需要使范围拖动器出现的东西。

用圆圈绘制图钉的示例代码:

 public class MapDemoActivity extends MapActivity { MapView mapView; MapController mc; GeoPoint p; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mapView = (MapView) findViewById(R.id.mapView); LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); View zoomView = mapView.getZoomControls(); zoomLayout.addView(zoomView, new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); mapView.displayZoomControls(true); mc = mapView.getController(); String coordinates[] = {"28.38", "77.12"}; double lat = Double.parseDouble(coordinates[0]); double lng = Double.parseDouble(coordinates[1]); p = new GeoPoint( (int) (lat * 1E6), (int) (lng * 1E6)); mc.animateTo(p); mc.setZoom(8); //---Add a location marker--- MapOverlay mapOverlay = new MapOverlay(); List<Overlay> listOfOverlays = mapView.getOverlays(); listOfOverlays.clear(); listOfOverlays.add(mapOverlay); mapView.invalidate(); } 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); //---translate the GeoPoint to screen pixels--- Point screenPts = new Point(); mapView.getProjection().toPixels(p, screenPts); //--------------draw circle---------------------- Point pt=mapView.getProjection().toPixels(p,screenPts); Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); circlePaint.setColor(0x30000000); circlePaint.setStyle(Style.FILL_AND_STROKE); canvas.drawCircle(screenPts.x, screenPts.y, 50, circlePaint); //---add the marker--- Bitmap bmp = BitmapFactory.decodeResource( getResources(), R.drawable.pin); canvas.drawBitmap(bmp, screenPts.x, screenPts.y-bmp.getHeight(), null); super.draw(canvas,mapView,shadow); return true; } } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } }