【问题标题】:How to implemennt OnZoomListener on MapView如何在 MapView 上实现缩放监听器
【发布时间】:2011-06-11 09:13:28
【问题描述】:

我想在我的 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);

【问题讨论】:

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


    【解决方案1】:

    通过这个方法试试

    map.setMapListener(new MapListener()
                    {
                        ....
    
                        @Override
                        public boolean onZoom(ZoomEvent event)
                            {
    
                                return false;
                            }
                    });
    

    【讨论】:

      【解决方案2】:

      我通过以下方式实现它,它适用于单点/多点触控:

      @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());
              }
          }
      

      它对我有用!

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          可能有点晚了,但您尝试过使用 OnOverlayGestureListener 吗?

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

          【讨论】:

            【解决方案5】:

            我把上面的所有代码放在一起,就想出了这个类:

            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(); }

            【讨论】:

              【解决方案6】:

              我必须继承 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,则每次都会检测到触摸,但地图缩放和平移将不起作用。

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                  【解决方案8】:

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

                  【讨论】:

                  • 显示缩放控制没有问题。我需要在缩放发生时引发一个事件。
                  猜你喜欢
                  • 1970-01-01
                  • 2013-10-25
                  • 2020-02-23
                  • 2011-08-21
                  • 2011-02-02
                  • 1970-01-01
                  • 2013-07-08
                  • 1970-01-01
                  • 2019-04-01
                  相关资源
                  最近更新 更多