默认情况下,GoogleMap 不提供地图拖动开始和拖动停止的事件。我已经在这里报告了这个问题。
我想定制 handler
将使用普通onTouch
事件并将其与setOnCameraChangeListener
.
但是我找不到如何访问对象onTouch
的事件GoogleMap
。它不提供这样的回调。
我想知道如何在Google Map API v2中处理地图的 onTouch 事件?
默认情况下,GoogleMap 不提供地图拖动开始和拖动停止的事件。我已经在这里报告了这个问题。
我想定制 handler
将使用普通onTouch
事件并将其与setOnCameraChangeListener
.
但是我找不到如何访问对象onTouch
的事件GoogleMap
。它不提供这样的回调。
我想知道如何在Google Map API v2中处理地图的 onTouch 事件?
这是确定拖动开始和拖动结束事件的可能解决方法:
你必须扩展SupportMapFragment
或MapFragment
。在onCreateView()
您必须将您MapView
的自定义包装FrameLayout
(在下面的示例中是 class TouchableWrapper
),您可以在其中拦截触摸事件并识别地图是否被点击。如果您onCameraChange
被调用,只需检查是否按下了地图视图(在下面的示例中,这是变量mMapIsTouched
)。
示例代码:
更新 1:
getView()
dispatchTouchEvent()
而不是onInterceptTouchEvent()
自定义框架布局:
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;
}
在您的相机更改回调方法中:
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();
}
}