Ответ 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);
}
}
};