【问题标题】:Double Tap Zoom in GoogleMaps Activity [duplicate]双击放大 GoogleMaps 活动 [重复]
【发布时间】:2011-03-12 07:51:17
【问题描述】:

可能重复:
Double Tap -> Zoom on Android MapView?

我是新手 Android 开发人员。我正在开发一个使用 GoogleMaps 的应用程序。我必须在 GoogleMaps 中实现双击缩放。当我双击地图时,它应该会放大。如果可能,请提供示例代码。
我已经写了以下代码,但我不知道要添加什么。

public class Maps extends MapActivity implements OnGestureListener, OnDoubleTapListener {

    private GestureDetector detector;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // MapViewer mapViewer = new MapViewer(null, null);
        MapView mapView = (MapView) findViewById(R.id.mapview);
        detector = new GestureDetector(this, this);
        mapView.setBuiltInZoomControls(true);
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    public boolean onDoubleTap(MotionEvent e) {
        mapView.getController().zoomIn();
        return false;
    }

    public boolean onDoubleTapEvent(MotionEvent e) {
        return false;
    }

    public boolean onSingleTapConfirmed(MotionEvent e) {
        return false;
    }

    public boolean onDown(MotionEvent e) {
        return false;
    }

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        return false;
    }

    public void onLongPress(MotionEvent e) {
    }

    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

    public void onShowPress(MotionEvent e) {
    }

    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }
}

【问题讨论】:

  • 你可以调用 mapView.getController().zoomIn() 或 zoomOut...
  • 调用 mapView.getController().zoomIn() 但在哪里??你能编辑我的代码吗?

标签: android google-maps double-click zooming


【解决方案1】:

根据此处提供的信息和double click/tap map zoom (Android),我得到的最佳解决方案是:

myLocationOverlay = new MyLocationOverlay(this, mapView);

MyItemizedOverlay itemizedOverlay = new MyItemizedOverlay() {
    private long systemTime = System.currentTimeMillis();

    @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if ((System.currentTimeMillis() - systemTime) < ViewConfiguration.getDoubleTapTimeout()) {
                mapController.zoomInFixing((int) event.getX(), (int) event.getY());
            }
            break;
        case MotionEvent.ACTION_UP:
            systemTime = System.currentTimeMillis();
            break;
        }

        return false;
    }
};

case MotionEvent.ACTION_UP 是由于 https://developer.android.com/reference/android/view/ViewConfiguration.html#getDoubleTapTimeout() 表示 getDoubleTapTimeout() 的计算方式而添加的。此外,我更改了缩放功能,因为这个功能最简单,功能与地图应用程序相同。

【讨论】:

  • 这似乎是要走的路,与第一个答案相同的实现方式,但我更喜欢它的彻底性和缩放行为。
  • 值得注意的是,我后来发现,当用户平移时,它也经常会错误地放大。我还没有时间解决这个问题,但我会在完成后发布。
【解决方案2】:
    @Override
public boolean onTouchEvent(MotionEvent event, MapView mapView) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        if ((System.currentTimeMillis() - systemTime) < 200) {
            mapView.getController().zoomIn();
        }
        systemTime = System.currentTimeMillis();
        break;
    }

    return false;
}

这将模拟放大。在您的 MapOverlay 中实现 (ItemizedOverlay)

【讨论】:

    【解决方案3】:

    要使其放大到点击的位置,只需添加:

    getController().animateTo(getProjection().fromPixels((int) ev.getX(), (int) ev.getY()));
    

    【讨论】:

      【解决方案4】:

      我也一直在寻找答案/示例,但找不到工作代码。

      最后,这是对我有用的代码:

      MyMapActivity.java

      public class MyMapActivity extends MapActivity implements OnGestureListener,
      OnDoubleTapListener{
      
      private MapView mapView;
      
      @Override
      public void onCreate(Bundle savedInstanceState) {
      
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          mapView = (MapView)findViewById(R.id.mapView);
      
      }
      @Override
      public boolean onDoubleTap(MotionEvent e) {
           int x = (int)e.getX(), y = (int)e.getY();;  
           Projection p = mapView.getProjection();  
           mapView.getController().animateTo(p.fromPixels(x, y));
           mapView.getController().zoomIn();  
        return true; 
      }
      //Here will be some autogenerated methods too
      

      OnDoubleTap.java

      public class OnDoubleTap extends MapView {
      
        private long lastTouchTime = -1;
      
        public OnDoubleTap(Context context, AttributeSet attrs) {
      
          super(context, attrs);
        }
      
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
      
          if (ev.getAction() == MotionEvent.ACTION_DOWN) {
      
            long thisTime = System.currentTimeMillis();
            if (thisTime - lastTouchTime < 250) {
      
              // Double tap
              this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
              lastTouchTime = -1;
      
            } else {
      
              // Too slow 
              lastTouchTime = thisTime;
            }
          }
      
          return super.onInterceptTouchEvent(ev);
        }
      }
      

      ma​​in.xml

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent">
      
              <azizbekyan.andranik.map.OnDoubleTap
                  android:id="@+id/mapView"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:enabled="true"
                  android:clickable="true"
                  android:apiKey="YOUR_API_KEY" />        
      </LinearLayout>
      

      不要忘记将此处的 android:apiKey 值替换为您的 apiKey

      【讨论】:

      • 这看起来是一种不错的轻量级检测双击的方法。明白 1) MotionEvent 知道它是什么时候创建的,所以你可以写:long thisTime = event.getEventTime();。 2)如果用户快速平移,这会将两个快速挥动手势误认为是双击(您应该检查两个点击事件移动的距离)。 3)请不要在多个问题中发布完全相同的答案,如果问题相同,请发表评论或使用指向重复问题的链接进行标记。
      • 1) 明白了。 2)是的,你也在这里。 3)下次会记住。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2011-02-11
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多