我正在编写一个代码来获取地图片段的中心lat-long并找到它周围的一些地方。为此,当用户拖动地图时,我将中心的lat-long传递给web api以获取位置。由于我使用CameraChangeListener获取中心的lat-long,因此它会在每次拖动时返回多个位置,从而增加不必要的网络调用。
我想检测拖拽并在几秒钟后调用,以便用户有足够的时间指出他想要的位置。
请建议一种方法。
谢谢: - )
答案 0 :(得分:1)
以下是确定拖动开始和拖动结束事件的可能解决方法:
您必须延长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);
}
}
};