Я думаю, что-то подобное может сработать
Когда вы впервые загружаете карту, получите проекцию и сохраните центр GeoPoint в середине вида, на котором отображается карта, используя класс Projection MapView
mapPosition = myMapView.getProjection().fromPixels(x,y)
Вернет GeoPoint, связанный с x, y, в этом случае xy должен быть центром MapView
Расширить класс MapView
public myMapView extends Mapview { }
Так что вы можетеoverride onDispatchDraw
В этом методе вы можете проверить, изменился ли уровень масштабирования, если нет, то, вероятно, это связано с панорамированием карты. Возможно, это и другие причины, зависящие от того, что вы делаете, но это разумнодумать, что большинство перерисовок - панорамирование, если исключить масштабирование
Сравните текущую проекцию GeoPoint в центре экрана с той, которую вы сохранили при запуске.Если он соответствует вашим дистанционным критериям, выполните вашу логику и обновите геопункт mapPosition.
Если я правильно понимаю ваш вопрос, что-то подобное должно сработать.Конечно, вы могли бы перегнать других членов расширенного класса, если вы не хотите проверять каждую перерисовку, также можно использовать события движения, но вы сказали, что у вас есть проблемы с ними.
ОБНОВЛЕНИЕ:
Возможно, вы сможете сделать это непосредственно в MapView по сравнению с пользовательским контейнером, но в прошлом я переопределил dispatchTouchEvent для расширенного контейнера.класс, внутри которого живет вид карты, в данном случае Framelayout, так что
public class myFrameLayout extends FrameLayout {
Затем внутри этого я использую что-то подобное для отслеживания состояния сенсорных движений, я уменьшу его до минимума, который должен работать«режимы» - это перечисления, которые я создал, когда вы выполняете логику, когда пользователь поднимает палец внизу оператора case
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_UP: // Second Finger
case MotionEvent.ACTION_DOWN: // First finger
mode = GESTURE_MODE.PRE_DRAG;
break;
case MotionEvent.ACTION_MOVE:
if (GESTURE_MODE.PRE_DRAG == mode) // Pan
mode = GESTURE_MODE.DRAG;
else
{
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
mode = GESTURE_MODE.MULTI_TOUCH;
break;
case MotionEvent.ACTION_UP: // All fingers removed
if (GESTURE_MODE.DRAG == mode)
{
// DO YOUR PANNING MOVED FAR LOGIC HERE
}
mode = GESTURE_MODE.NONE;
break;
}
return super.dispatchTouchEvent(event);
}