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

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

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

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

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

Solutions Collecting From Web of "如何在Google Map API v2中处理地图的onTouch事件?"

以下是确定拖动开始和拖动结束事件的可能的解决方法:

您必须扩展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(); } }