2010-09-12 21 views
11

Pude obtener el mapa que se muestra en la pantalla. Ahora el usuario se moverá por el mapa y lo presionará. Después de presionar un punto, necesito agregar un alfiler en la pantalla en la ubicación presionada. Si el usuario decide ir a otro punto, al presionar sobre el punto elegido, el primer marcador sería desaparecerá y uno nuevo será dibujado en la nueva ubicaciónMapView agregar marcadores al toque

lo hice así:

public class LocationSelectionActivity extends MapActivity 
{  
    GeoPoint p; 
    List<Overlay> listOfOverlays; 
    MapOverlay mapOverlay; 

    private MapView mapView; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.locationselection); 

     mapView = (MapView) findViewById(R.id.mapView); 
     mapView.setSatellite(false); 

     final MapController mc = mapView.getController(); 
     String coordinates[] = {"46.540606", "22.454542"}; 

     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(10); 


     ZoomControls zoomControls = (ZoomControls) findViewById(R.id.zoomcontrols); 
     zoomControls.setOnZoomInClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
         mc.zoomIn(); 
       } 
     }); 
     zoomControls.setOnZoomOutClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
         mc.zoomOut(); 
       } 
     }); 

     //---Add a location marker--- 
     mapOverlay = new MapOverlay(); 
     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); 

      //---add the marker--- 
      Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.map_flag);    
      canvas.drawBitmap(bmp, screenPts.x, screenPts.y-48, null); 

      return true; 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event, MapView mapView) 
     { 
      //---when user lifts his finger--- 
      if (event.getAction() == 1) {     
       GeoPoint p = mapView.getProjection().fromPixels(
        (int) event.getX(), 
        (int) event.getY()); 
        Toast.makeText(getBaseContext(), 
         p.getLatitudeE6()/1E6 + "," + 
         p.getLongitudeE6() /1E6 , 
         Toast.LENGTH_SHORT).show(); 

      }        
      return false; 
     }   

    } 

Este dibuja la chincheta inicial (el recurso map_flag). Al hacer clic en el mapa, obtengo el Toast con los coordonates ... todo queda por hacer en un nuevo clic, borro el pin antiguo y agrego uno nuevo.

¿Pero cómo hacerlo?

Respuesta

15

Yo usaría un ItemizedOverlay, en lugar de un Overlay normal. Luego, todo lo que necesita hacer es actualizar su colección de objetos OverlayItem y llamar al populate() en el ItemizedOverlay.

Aquí está a sample project mostrando arrastrar y soltar de un pin usando ItemizedOverlay.

+0

Hola, quiero m Cómo un punto cuando busco el lugar, pero lo que quiero hacer es que si quiero cambiar el lugar que está cerca de ese lugar por recoger ese punto ¿cómo puedo hacer ¿verdad ayúdenme por favor –

1
@Override 
public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{ 
    //---when user lifts his finger--- 
    if (event.getAction() == 1) {     
     p = mapView.getProjection().fromPixels(
      (int) event.getX(), 
      (int) event.getY()); 
      Toast.makeText(getBaseContext(), 
       p.getLatitudeE6()/1E6 + "," + 
       p.getLongitudeE6() /1E6 , 
       Toast.LENGTH_SHORT).show(); 
    }        
    return false; 
}   

Esto funcionará. Haga que GeoPoint Public de OnTouchEvent ...

+0

Esto no agrega un elemento de superposición ... –

3

Este código funciona bien.

@Override 
     public boolean onTap(GeoPoint p, MapView mapView) { 
      Log.d("tap event ", "tap called"); 
      mapOverlays = mapView.getOverlays(); 
      drawable =getResources().getDrawable(R.drawable.marker); 
      itemizedOverlay = new SitesOverlay(drawable); 
      int lat=(int)p.getLatitudeE6(); 
      int lng=(int)p.getLongitudeE6(); 


      GeoPoint point = new GeoPoint(lat,lng); 
      Log.d("tap event ", "tapcalled"+lat+""+lng); 
      OverlayItem overlayitem = new OverlayItem(point, "", ""); 

      items.add(overlayitem); 
      populate(); 
      Log.d("tap event ", "populated"); 
      //  mapOverlays.add(itemizedOverlay); 


      return true; 
     } 
Cuestiones relacionadas