Как правильно определить, когда окно MapView Lat / Lon изменилось? - PullRequest
0 голосов
/ 22 января 2011

Я разрабатываю приложение для Android, которое использует MapView. Я хотел бы запускать процедуру всякий раз, когда видимая часть карты изменяется (из-за масштабирования / панорамирования / поворота телефона / и т. Д.), И я хотел бы передать новые значения широты и долготы процедуре.

Я думал, что мог бы переопределить onInterceptTouchEvent, чтобы сделать это, но тогда процедура, кажется, запускается только при первом прикосновении к экрану (так, например, панорамирование перетаскиванием пальца вызывает процедуру только в начале перетаскивания движение). Это означает, что процедура никогда не вызывается с новыми координатами.

Итак, как правильно это сделать?

1 Ответ

2 голосов
/ 22 января 2011

Возможно, вам придется объединить несколько методов для достижения того, что вы хотите.

Чтобы поймать панорамирование, я бы попробовал переопределить ваши MapViews onTouchEvent () или, возможно, dispatchTouchEvent (), и прослушать MotionEvent.Событие ACTION_UP.Это срабатывает, когда пользователь убирает палец с экрана:

public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction()==MotionEvent.ACTION_UP) {
    // Call your procedure here
  }

  return super.onTouchEvent(ev);
}

Если вы хотите вызвать вашу процедуру во время панорамирования, я думаю, вам придется искать движение панорамирования, перекрывающее одно из двухте же методы.Примерно так:

public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_MOVE) {
    if (event.getHistorySize() < 1)
      return; // First call, no history

    // Get difference in position since previous move event
    float diffX = event.getX() - event.getHistoricalX(event.getHistorySize() - 1);
    float diffY = event.getY() - event.getHistoricalY(event.getHistorySize() - 1);

    if (Math.abs(diffX) > 0.5f || Math.abs(diffY) > 0.5f) {
      /* Position has changed substantially, so this is probably a drag action. 
         Call your procedure here. */
    }
  }
}

Чтобы обнаружить изменение уровня масштабирования, вы можете переопределить dispatchDraw:

int oldZoomLevel=-1;

public void dispatchDraw(Canvas canvas) {
  super.dispatchDraw(canvas);

  if (getZoomLevel() != oldZoomLevel) {
    // Call your procedure here

    oldZoomLevel = getZoomLevel();
  }
}
...