谷歌地图默认不提供地图拖动开始和结束事件。 我已经在这里报告了这个问题。
我想制作一个自定义处理程序,它将使用普通的 onTouch
事件,并将其与 setOnCameraChangeListener
结合使用。
但是我找不到如何访问 GoogleMap
对象的 onTouch
事件。 它没有提供这样的回调。
我想知道如何在Google Map API v2中处理地图的触摸事件?
谷歌地图默认不提供地图拖动开始和结束事件。 我已经在这里报告了这个问题。
我想制作一个自定义处理程序,它将使用普通的 onTouch
事件,并将其与 setOnCameraChangeListener
结合使用。
但是我找不到如何访问 GoogleMap
对象的 onTouch
事件。 它没有提供这样的回调。
我想知道如何在Google Map API v2中处理地图的触摸事件?
以下是用于确定拖拽开始和拖拽结束事件的一种可能解决方法:
您需要扩展SupportMapFragment
或MapFragment
。在onCreateView()
中,您需要将您的MapView
放到自定义的FrameLayout
(在下面的示例中,它是TouchableWrapper
类)中,在其中截取触摸事件并识别地图是否被点击。如果调用了您的onCameraChange
,只需检查地图视图是否被按下或未被按下(在下面的示例中,这是变量mMapIsTouched
)。
示例代码:
更新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;
}
在您的相机更改回调方法中:
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();
}
}