如何在Google Map API v2中处理地图的onTouch事件?

GoogleMap默认不提供地图拖动开始和拖动停止的事件。 我已经在这里报告了这个问题 。

我想使自定义 handler ,将使用普通的onTouch事件,并将其与setOnCameraChangeListener结合起来。

但是我没有find我可以访问GoogleMap对象的onTouch事件。 它不提供这样的callback

我不知道我怎么能在Google Map API v2中处理地图的onTouch事件?

  • 使用经度和纬度比较两个位置
  • Google Maps Android MapView是否使用不同分辨率的图块来显示不同的屏幕密度?
  • 如何在Android中获取地图上的纬度和经度?
  • ItemizedOverlay.getIndexToDraw中的NullPointerException
  • 将图像和文本组合成可绘制的
  • ItemizedOverlay.getIndexToDraw中的NullPointerException
  • android - GC_FOR_ALLOC释放6346K,7%空闲,暂停143ms,总共143ms
  • Android“你好,MapView”教程 - 地图瓷砖不加载
  • 以下是确定拖动开始和拖动结束事件的可能的解决方法:

    您必须扩展SupportMapFragmentMapFragment 。 在onCreateView()你必须把你的MapView包装在一个自定义的FrameLayout (在下面的例子中是类TouchableWrapper ),在这个类中你可以截取触摸事件,并识别是否挖掘地图。 如果你的onCameraChange被调用,只要检查是否按下地图视图(在下面的例子中是variablesmMapIsTouched )。

    示例代码:

    更新1:

    • getView()返回原创视图
    • 使用dispatchTouchEvent()而不是onInterceptTouchEvent()

    自定义FrameLayout:

     private class TouchableWrapper extends FrameLayout { @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mMapIsTouched = true; break; case MotionEvent.ACTION_UP: mMapIsTouched = false; break; } return super.dispatchTouchEvent(ev); } } 

    在你自定义的MapFragment中:

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState); mTouchView = new TouchableWrapper(getActivity()); mTouchView.addView(mOriginalContentView); return mTouchView; } @Override public View getView() { return mOriginalContentView; } 

    在你的相机改变callback方法:

     private final OnCameraChangeListener mOnCameraChangeListener = new OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { if (!mMapIsTouched) { refreshClustering(false); } } }; 

    有一个更简单的方法来做到这一点, onCameraMoveStarted监听器像这样处理你的情况

    下面的代码片段

     @Override public void onCameraMoveStarted(int reason) { if (reason == OnCameraMoveStartedListener.REASON_GESTURE) { Toast.makeText(this, "The user gestured on the map.", Toast.LENGTH_SHORT).show(); } else if (reason == OnCameraMoveStartedListener .REASON_API_ANIMATION) { Toast.makeText(this, "The user tapped something on the map.", Toast.LENGTH_SHORT).show(); } else if (reason == OnCameraMoveStartedListener .REASON_DEVELOPER_ANIMATION) { Toast.makeText(this, "The app moved the camera.", Toast.LENGTH_SHORT).show(); } }