2011-09-22 131 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()。