2010-09-12 8 views
11

Ich schaffte es, die Karte auf dem Bildschirm angezeigt zu bekommen. Jetzt bewegt sich der Benutzer auf der Karte und drückt darauf. Nach dem Drücken auf einen Punkt muss ich einen Push-Pin auf dem Bildschirm an der gedrückten Stelle hinzufügen. Wenn der Benutzer für einen anderen Punkt zu gehen entscheidet, wenn sie auf dem gewählten Punkt drücken, würde der erste Reißzwecke disapear und ein neues Geschäft auf dem neuen StandortMapView Hinzufügen von Pins bei Berührung

ich so tat gezogen werden:

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

    } 

Diese zeichnet den ersten Pin (die Ressource map_flag). Wenn ich auf die Karte klicke, bekomme ich den Toast mit den Koordinaten ... Alles was noch zu tun ist, ist ein neuer Klick, lösche den alten Pin und füge einen neuen hinzu.

Aber wie geht das?

Antwort

15

Ich würde eine ItemizedOverlay anstelle einer regulären Overlay verwenden. Dann müssen Sie nur Ihre Sammlung von OverlayItem Objekten aktualisieren und populate() auf der ItemizedOverlay aufrufen.

Hier ist a sample project zeigt Drag-and-Drop eines Pins mit ItemizedOverlay.

+0

Hallo, ich möchte bin ein Punkt, wenn ich den Platz zu suchen, aber was ich tun möchte, ist, dass, wenn ich will, um den Ort zu ändern, die in der Nähe dieser Stelle ist durch diesen Punkt Kommissionierung, wie ich kann, was Sie tun können Hilf mir bitte –

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

Dies wird funktionieren. Make OnTouchEvent GeoPoint Public ...

+0

Dies fügt kein overlayItem hinzu ... –

3

Dieser Code funktioniert einwandfrei.

@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; 
     } 
Verwandte Themen