2011-09-22 183 views
0

有沒有什麼辦法可以實現縮放監聽器,只要縮放級別發生變化就可以觸發事件。到目前爲止,我已經使用onUserinteraction方法手動檢查變化的縮放級別。 另一件事是我想要動態地添加/刪除疊加層。到目前爲止,我所做的是在onUserinteraction方法中,我調用一個函數,它使用mapOverlays.add()函數動態地添加疊加層,並且實際上添加會動態發生。但不知何故,mapOverlays.remove()函數不刪除覆蓋Android地圖覆蓋問題

 //Function for adding first set of markers 
    public void setOverlay() 
{ 
    worldLength = World.length; 
    mapOverlays = mapView.getOverlays(); 
    drawable0 = this.getResources().getDrawable(R.drawable.marker); 
    itemizedOverlay0 = new MyItemizedOverlay(drawable0); 
    for (int i = 0; i < worldLength; i++) 
    { 
     itemizedOverlay0.addOverlay(World[i]); 
    } 
    mapOverlays.add(itemizedOverlay0); 
    mapView.postInvalidate(); 
} 
    //Function for adding second set of markers 
    public void setOverlay1() 
    { 
     mapView.setStreetView(true); 
     usaLength = USA.length; 
     mexicoLength = Mexico.length; 
       mapOverlays = mapView.getOverlays(); 
     drawable1 = this.getResources().getDrawable(R.drawable.marker); 
     itemizedOverlay1 = new MyItemizedOverlay(drawable1); 
     itemizedOverlay2 = new MyItemizedOverlay(drawable1); 


     for (int i = 0; i < usaLength; i++) { 
      itemizedOverlay1.addOverlay(USA[i]); 
     } 
     for (int i = 0; i < mexicoLength; i++) { 
      itemizedOverlay2.addOverlay(Mexico[i]); 
     } 

     mapOverlays.add(itemizedOverlay1); 
     mapOverlays.add(itemizedOverlay2); 


    mapView.postInvalidate(); 

} 

    public void onUserInteraction() { 
    super.onUserInteraction(); 
    if(mapView.getZoomLevel()>3) 
    { 
     mapOverlays.remove(itemizedOverlay0); 
     setOverlay1(); 
       //the above happens 
    } 
    else if(mapView.getZoomLevel()<=3 && mapOverlays.size()>5) 
    { 
     mapOverlays.remove(itemizedOverlay1); 
     mapOverlays.remove(itemizedOverlay2); 
       //the above doesn't 
     setOverlay(); 
    } 
    else if(mapView.getZoomLevel()<=3) 
    { 

    } 
} 

回答

1

爲了實現您的自定義縮放處理程序並添加偵聽器,您需要創建MapView的子類。首先,我們來創建OnZoomListener的界面。請注意,你可以改變接口,以滿足您的需要,下面只是一個框架代碼與


public interface OnZoomListener { 
    /*** 
    * /** 
    * Called when there is a zoom changes 
    * @param mapView Reference to the current map view 
    * @param currentZoom The current zoom, set to -1 initially 
    * @param newZoom The new zoom level 
    */ 
    public void onZoomChanged(MapView mapView, int currentZoom, int newZoom); 
} 

現在開始,你需要一個子類,它會調用這個OnZoomListener每當變焦的變化。以下是一個框架代碼這是this SO Answer


public class MyMapView extends MapView { 
    int oldZoomLevel=-1; 
    OnZoomListener onZoomListener; 

    public MyMapView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public MyMapView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyMapView(Context context, String apiKey) { 
     super(context, apiKey); 
    } 

    public void setOnZoomListener(OnZoomListener onZoomListener) { 
     this.onZoomListener = onZoomListener; 
    } 

    @Override 
    public void dispatchDraw(Canvas canvas) { 
     super.dispatchDraw(canvas); 
     int newZoom = this.getZoomLevel(); 

     if (newZoom != oldZoomLevel) { 
      // dispatch the listeners 
      if(oldZoomLevel != -1 && onZoomListener != null) { 
       onZoomListener.onZoomChanged(this, oldZoomLevel, newZoom); 
      } 

      // update the new zoom level 
      oldZoomLevel = getZoomLevel(); 
     } 
    } 
} 

的擴展現在,你可以在你的佈局中使用MyMapView而不是標準的MapView的。注意:代碼包com.so4729255是我僅用於測試的。


    <com.so4729255.MyMapView 
       android:id="@+id/mapview" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:enabled="true" 
       android:apiKey="YOUR API KEY" 
       android:clickable="true" 
     /> 

最後在您的代碼中添加OnZoomListener。下面的代碼只顯示吐司的用法說明,你可以做任何你需要做的還有


MyMapView mapView = (MyMapView)this.findViewById(R.id.mapview); 
     mapView.setOnZoomListener(new OnZoomListener() { 
      public void onZoomChanged(MapView mapView, int currentZoom, 
        int newZoom) { 
       // implement your handler here 
       Toast t = Toast.makeText(WebViewMain.this, "Zoom has changed from " + currentZoom + " to " + 
         newZoom, 500); 
       t.show(); 
      } 
     }); 

關於你的第二個問題,每個人都回答,稱MapView.invalidate()應重繪地圖與新的狀態它會強制查看重繪每the API documentation

+0

這是好的,一定會嘗試和回來,我需要知道盡快我無法使用mapOverlays.remove(itemizedOverlayname);任何直接的幫助將不勝感激.....感謝百萬 –

+0

你試過調用MapView.invalidate()而不是mapView.postInvalidate()? invalidate()應該根據文檔立即重繪地圖(至少對於我之前完成的所有地圖案例)。 – momo

+0

已經完成並且沒有工作,我只注意到remove方法只會刪除覆蓋對象的第一次出現,但是我的錯誤代碼會多次添加相同的覆蓋,因此我無法看到結果。將修復和正確回答我自己的問題....順便說一句我正在實施烏拉圭回合變焦監聽者的想法! –

0

好,你必須使用刷新

mapview.invalidate() 

postInvalidate職位UI線程上的無效請求的地圖,而 呼叫無效()立即無效查看

+1

什麼都沒有發生,沒有工作 –

0

當縮放級別改變時,地圖重繪,所以我只是把這種類型的func在我的覆蓋的繪製方法,如下所示:

[email protected] 
public void draw(Canvas canvas, MapView mapv, boolean shadow) 
{  
    int zoom = mapv.getZoomLevel(); 

    switch(zoom) 
    { 
     case 19: 
      setMarkersForZoomLevel19(); 
      break; 
     case 18: 
      setMarkersForZoomLevel18(); 
      break; 
     case 17: 
      setMarkersForZoomLevel17(); 
      break; 
     case 16: 
      setMarkersForZoomLevel16(); 
      break; 
     default: 
      // Hide the markers or remove the overlay from the map view.     
      mapv.getOverlays().clear(); 
    }  

    // Putting this call here rather than at the beginning, ensures that 
    // the Overlay items are drawn over the top of canvas stuff e.g. route lines. 
    super.draw(canvas, mapv, false);   
} 

當您刪除疊加層時,請記得調用mapView.invalidate()。