如何在MapView上实现OnZoom监听器

时间:2011-01-18 21:28:33

标签: android zoom listener android-mapview event-listener

我想在我的MapView上使用onZoomListener。 下面的代码就是我所做的。它会记录是否点按了缩放按钮。由于所有新手机现在都支持缩放,这是没用的。有没有人知道如何真正做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);

8 个答案:

答案 0 :(得分: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,则每次都会检测到触摸,但是地图缩放和平移将不起作用。

答案 1 :(得分: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();
}

答案 2 :(得分:1)

也许有点晚了,但你尝试过使用OnOverlayGestureListener吗?

http://code.google.com/p/mapview-overlay-manager/wiki/OnOverlayGestureListener

答案 3 :(得分:0)

编辑:我相信你发现的可能是允许这种检测的唯一机制。 (编辑我的帖子以删除错误信息)扩展MapView并覆盖onDraw()方法将起作用。要做的一个考虑因素是触发缩放代码的频率。例如,在缩放onDraw时可能会被调用数十次,每次都有不同的缩放级别。如果您的听众每次都在开火,这可能会导致性能不佳。您可以通过确定已发生缩放更改来限制此操作,然后在触发事件之前等待两次后续重绘时的缩放级别相同。这一切都取决于您希望如何调用代码。

答案 4 :(得分:0)

使用dispatchTouch()方法检测地图上的触摸事件,并确保调用super()方法执行默认的地图触摸功能。 (如果从函数返回true,设置onTouchListener将禁用内置事件,如缩放和平移,如果返回false,则仅触摸一次触摸。)

在dispatchTouch方法中,您可以使用event.getPointerCount()检查没有触摸点。使用Action_UP通过调用mapview.getZoomLevel()来检测用户是否缩小了;如果您发现缩放级别已更改,则可以执行操作。

答案 5 :(得分: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());
        }
    }

它对我有用!

答案 6 :(得分:0)

尝试通过此方法

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

                    @Override
                    public boolean onZoom(ZoomEvent event)
                        {

                            return false;
                        }
                });

答案 7 :(得分:-7)

MapView提供支持捏合的内置缩放控件。 如果它无法使用,您可以尝试设置mapView.setBuiltInZoomControls(true); 这样您就不需要OnZoomListener。

相关问题