2010-09-12 34 views
11

我設法讓地圖顯示在屏幕上。現在用戶將在地圖上移動並按下它。按下一個點後,我需要在按下的位置上的屏幕上添加一個圖釘。如果用戶決定去另一點,所選擇的點壓接時,第一個圖釘將disapear和新的人會在新的位置MapView在觸摸時添加圖釘

我不喜歡這樣可以得出:

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

    } 

這繪製初始圖釘(map_flag資源)。當點擊地圖時,我會收到Toast和coordonates ...所有剩下的工作就是點擊一下,抹掉舊的pin並添加一個新的pin。

但是怎麼做呢?

回答

15

我會使用ItemizedOverlay,而不是一個普通的Overlay。然後,您只需更新OverlayItem對象的集合並在ItemizedOverlay上調用populate()即可。

這裏是a sample project顯示使用ItemizedOverlay拖放一個引腳。

+0

您好,我想m如果一個點,當我搜索的地方,但我想要做的是,如果我想改變它的採摘點靠近那個地方的地方我該怎麼辦可以嗎幫助我請 – 2012-06-08 11:35:37

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

這將工作。使OnTouchEvent的GeoPoint Public ...

+0

這不會添加overlayItem ... – 2011-03-01 14:57:09

3

此代碼工作正常。

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