2011-06-09 85 views
7

我triyng在谷歌地圖上添加多個標記。這裏是我的代碼部分在谷歌地圖上添加多個標記在android

public class GoogleMap extends MapView 
{ 
    MapController mc; 
    MapView mapView; 
    GeoPoint p; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    .... 

     double lat = Double.parseDouble(bundle.getString("paramLat")); 
     double lng = Double.parseDouble(bundle.getString("paramLong")); 

     mc = mapView.getController(); 
     p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)); 
     mc.animateTo(p); 
     mc.setZoom(17); 

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

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


        return true; 



     } 
} 

我在這裏有兩個問題。當我試圖添加只有一個標記,它的作品,但繪製方法被調用多次。但爲什麼?它何時被調用?

第二個問題是我如何添加新的標記。我創建了名爲p2的第二個geoPoint,之後應該怎麼做?非常感謝你。

回答

0
  1. 要防止多個繪圖,您需要緩存。這是MapOverlay的繪製方法中的一個錯誤
  2. 要添加多個標記,您必須使用ItemizedOverlay。 This may help you.
0

你會想要開始一個ItemizedOverlay這是一個點數組。你可以在這裏找到文檔http://code.google.com/android/add-ons/google-apis/reference/index.html。然後你想要調用ItemizedOverlay.draw()方法,它將根據它們的位置來繪製其中的所有點。希望這可以幫助。

+1

並且是繪製多次爲地圖上的每個層。首先繪製網格,然後繪製地圖,然後繪製點。如果它多次顯示屏幕刷新,那麼idk發生了什麼事情。 – Shaun 2011-06-09 15:29:10

14

我在我的項目中實現了多個標記。這裏是示例代碼;有些事情你需要改變的是標記圖像,長度(你想要在for循環中定義的標記的數量)。希望這會有所幫助!

public class ShowMapActivity extends MapActivity{ 
    private MapController mapControll; 
    private GeoPoint geoPoint=null; 
    private MapView mapview; 
    private MyItemizedOverlay userPicOverlay; 
    private MyItemizedOverlay nearPicOverlay; 
    private Drawable userPic,atmPic; 
    private OverlayItem nearatms[] = new OverlayItem[50]; 
    public static Context context; 

    @Override 
    protected void onCreate(Bundle icicle) { 
     // TODO Auto-generated method stub 
     super.onCreate(icicle); 
     context = getApplicationContext(); 
     setContentView(R.layout.your layout xml); 
     showMap(); 
    } 

    public void showMap() { 
     // TODO Auto-generated method stub 

     try { 
      geoPoint = new GeoPoint((int)(latitude * 1E6),(int)(longitude * 1E6));   
      mapview = (MapView)findViewById(R.id.mapview); 
      mapControll= mapview.getController(); 
      mapview.setBuiltInZoomControls(true); 
      mapview.setStreetView(true); 
      mapControll.setZoom(16); 
      mapControll.animateTo(geoPoint); 

      userPic = this.getResources().getDrawable(R.drawable.your pic); 
      userPicOverlay = new MyItemizedOverlay(userPic); 
      OverlayItem overlayItem = new OverlayItem(geoPoint, "I'm Here!!!", null); 
      userPicOverlay.addOverlay(overlayItem); 
      mapview.getOverlays().add(userPicOverlay); 


      atmPic = this.getResources().getDrawable(R.drawable.your pic); 
      nearPicOverlay = new MyItemizedOverlay(atmPic); 
      for (int i = 0; i < define your length here; i++) { 
       nearatms[i] = new OverlayItem(new GeoPoint((int)((latitude) * 1E6)),(int)(longitude) * 1E6)),"Name", null);//just check the brackets i just made change here so.... 
       nearPicOverlay.addOverlay(nearatms[i]); 
      } 
      mapview.getOverlays().add(nearPicOverlay); 
      //Added symbols will be displayed when map is redrawn so force redraw now 
      mapview.postInvalidate(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

} 

分項類用於放置標記物

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> { 

    private ArrayList<OverlayItem> myOverlays ; 

    public MyItemizedOverlay(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
     myOverlays = new ArrayList<OverlayItem>(); 
     populate(); 
    } 

    public void addOverlay(OverlayItem overlay){ 
     myOverlays.add(overlay); 
     populate(); 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     return myOverlays.get(i); 
    } 

    // Removes overlay item i 
    public void removeItem(int i){ 
     myOverlays.remove(i); 
     populate(); 
    } 

    // Returns present number of items in list 
    @Override 
    public int size() { 
     return myOverlays.size(); 
    } 


    public void addOverlayItem(OverlayItem overlayItem) { 
     myOverlays.add(overlayItem); 
     populate(); 
    } 


    public void addOverlayItem(int lat, int lon, String title) { 
     try { 
      GeoPoint point = new GeoPoint(lat, lon); 
      OverlayItem overlayItem = new OverlayItem(point, title, null); 
      addOverlayItem(overlayItem);  
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected boolean onTap(int index) { 
     // TODO Auto-generated method stub 
     String title = myOverlays.get(index).getTitle(); 
     Toast.makeText(ShowMapActivity.context, title, Toast.LENGTH_LONG).show(); 
     return super.onTap(index); 
    } 
} 
+0

如果您已經在MyItemizedOverlay類的addoverlay方法中添加overlayitem ..爲什麼您需要添加另一個名爲addOverlayItem的方法..?我不明白這是如何工作的? – user590849 2012-11-05 01:29:51

+0

我已經簡化了用戶的事情。如果任何人想直接提供lat,long和字符串,則可以使用addOverlay方法的其他風格。沒有別的與此相關。 – Scorpion 2012-11-05 02:58:19