确定MapView的Lat / Lon窗口何时发生变化的正确方法是什么?

时间:2011-01-21 21:02:53

标签: android android-mapview

我正在开发一个使用MapView的Android应用程序。我想在地图的可见部分发生变化时(由于缩放/平移/旋转手机等)运行程序,并且我想将新的纬度和经度值传递给程序。

我认为我可以覆盖onInterceptTouchEvent来执行此操作,但是当您第一次触摸屏幕时,程序似乎只会运行(例如,通过拖动手指进行平移只调用开头的过程拖动动作)。这意味着永远不会使用新坐标调用该过程。

那么 - 这是正确的方法吗?

1 个答案:

答案 0 :(得分:2)

您可能需要结合多种技术来实现您的目标。

要捕获平移,我会尝试覆盖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();
  }
}