Creación de superposición personalizada en el mapa

Estoy intentando replicar esta característica de Maps en Android: Superposición de mapas personalizados

Usted puede ver que en el mapa, hay un círculo que representa el rango que el usuario ha seleccionado.

En mi aplicación, también quiero un arrastrador para residir en el perímetro del círculo, que se puede arrastrar para redefinir el radio.

Si alguien pudiera decirme cómo dibujar superposiciones personalizables y gráficos 2D en el mapa, puedo hacer otras cosas por mi cuenta.

¡Gracias!

Se puede acceder a la solicitud completa en este enlace

    Bueno, traté de hacer las cosas por mi cuenta, y poner este código para obtener el efecto anterior:

    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); } } } 

    Esto me permite tener el siguiente efecto:

    Efecto en el mapa

    El cálculo utilizado puede no ser lo que desea.
    Es sólo para fines de demostración.
    El cálculo de distancia / distancia real requiere el uso de cojinetes también y tiene una fórmula específica.
    Déjeme saber si usted tiene alguna pregunta con respecto a esto.

    Amplíe la clase ItemizedOverlay para anular el método draw () . El Canvas en el que se dibujan las superposiciones se pasa a ese método y se puede llamar a drawCircle o cualquier cosa que sea necesario para que aparezca el arrastrador de rangos.

    Un código de ejemplo para dibujar un alfiler con el círculo:

     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; } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.