2011-01-18 46 views
10

我想在我的MapView上使用onZoomListener。下面的代碼就是我所做的。它註冊是否點擊縮放按鈕。由於所有新手機現在都支持縮放,所以這沒用。有沒有人知道如何做到真正的onLoomListener?謝謝。如何在MapView上實現OnZoomListener

OnZoomListener listener = new OnZoomListener() { 
    @Override 
    public void onVisibilityChanged(boolean arg0) { 
    // TODO Auto-generated method stub 

    } 
    @Override 
    public void onZoom(boolean arg0) { 
    Log.d(TAG, "ZOOM CHANGED"); 
    // TODO Auto-generated method stub 

    } 
    }; 

    ZoomButtonsController zoomButton = mapView.getZoomButtonsController(); 
    zoomButton.setOnZoomListener(listener); 

回答

25

我有子類MapView類,並覆蓋dispatchDraw

下面是代碼:

int oldZoomLevel=-1; 
@Override 
public void dispatchDraw(Canvas canvas) { 
    super.dispatchDraw(canvas); 
    if (getZoomLevel() != oldZoomLevel) { 
    Log.d(TAG, "ZOOOMED"); 
    oldZoomLevel = getZoomLevel(); 
    } 
} 

這個博客對我幫助很大:http://pa.rezendi.com/2010/03/responding-to-zooms-and-pans-in.html

以上的偉大工程。有沒有更簡單的解決方案? 我試圖直接在MapView上實現onTouchListener,但是如果onTouchListener返回false,觸摸事件將僅被檢測一次。如果返回true,則每次都會檢測到觸摸,但地圖縮放和平移不起作用。

0

編輯:我相信你發現的可能是唯一的機制,允許這種檢測。 (編輯我的帖子以刪除錯誤信息)擴展MapView並重寫onDraw()方法將會起作用。需要考慮的一點是多頻繁地觸發收聽縮放的代碼。例如,雖然縮放onDraw可能會被調用幾十次,每次都有不同的縮放級別。如果您的聽衆每次發射都會導致性能下降。您可以通過確定變焦已經發生,然後在發射事件之前等待縮放級別在隨後的兩次重繪中保持一致來節制。這完全取決於你希望如何調用你的代碼。

-7

MapView提供內置的縮放控件,支持捏。 如果它不能開箱即用,您可以嘗試設置mapView.setBuiltInZoomControls(true); 這樣您就不需要OnZoomListener。

+0

我沒有與顯示縮放控制問題嘗試。我需要在發生縮放時引發一個事件。 – bobetko 2011-01-18 23:15:56

11

我把所有的代碼從上面在一起,並與這個類想出了:

 

package at.blockhaus.wheels.map; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 

import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapView; 

public class CustomMapView extends MapView { 

    private int oldZoomLevel = -1; 
    private GeoPoint oldCenterGeoPoint; 
    private OnPanAndZoomListener mListener; 

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

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

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

    public void setOnPanListener(OnPanAndZoomListener listener) { 
     mListener = listener; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     if (ev.getAction() == MotionEvent.ACTION_UP) { 
      GeoPoint centerGeoPoint = this.getMapCenter(); 
      if (oldCenterGeoPoint == null || 
        (oldCenterGeoPoint.getLatitudeE6() != centerGeoPoint.getLatitudeE6()) || 
        (oldCenterGeoPoint.getLongitudeE6() != centerGeoPoint.getLongitudeE6())) { 
       mListener.onPan(); 
      } 
      oldCenterGeoPoint = this.getMapCenter(); 
     } 
     return super.onTouchEvent(ev); 
    } 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     super.dispatchDraw(canvas); 
     if (getZoomLevel() != oldZoomLevel) { 
      mListener.onZoom(); 
      oldZoomLevel = getZoomLevel(); 
     } 
    } 


} 
 

以及相應的偵聽器接口:

 

package at.blockhaus.wheels.map; 

public interface OnPanAndZoomListener { 
    public void onPan(); 
    public void onZoom(); 
} 
 
0

使用dispatchTouch()方法來檢測在地圖上的觸摸事件,並確保你調用超()方法來進行默認地圖觸摸功能。 (設置onTouchListener將禁用內置事件,如縮放和平移,如果您從功能中返回true,並且只會在返回false時處理觸摸一次。)

在dispatchTouch方法中,您可以通過dispatchTouch方法檢查是否存在觸摸點使用event.getPointerCount()。使用Action_UP通過調用mapview.getZoomLevel();來檢測用戶是否縮小了。如果您發現縮放級別已更改,則可以執行您的操作。

0

我實現它通過以下方式,它適用於單/多點觸控:

@Override 
protected void dispatchDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.dispatchDraw(canvas); 
    if (oldZoomLevel == -1) { 
     oldZoomLevel = getZoomLevel(); 
    } 
    if (oldZoomLevel < getZoomLevel()) { 
     System.out.println("zoomed in"); 
     if (mOnZoomInListener != null) { 
      mOnZoomInListener 
        .onZoomedIn(this, oldZoomLevel, getZoomLevel()); 
     } 
    } 
    if (oldZoomLevel > getZoomLevel()) { 
     System.out.println("zoomed out"); 
     if (mOnZoomOutListener != null) { 
      mOnZoomOutListener.onZoomedOut(this, oldZoomLevel, 
        getZoomLevel()); 
     } 
    } 

它爲我工作!

0

通過這種方法

map.setMapListener(new MapListener() 
       { 
        .... 

        @Override 
        public boolean onZoom(ZoomEvent event) 
         { 

          return false; 
         } 
       });