我正在开发一个使用MapView
的Android应用程序。我想在地图的可见部分发生变化时(由于缩放/平移/旋转手机等)运行程序,并且我想将新的纬度和经度值传递给程序。
我认为我可以覆盖onInterceptTouchEvent
来执行此操作,但是当您第一次触摸屏幕时,程序似乎只会运行(例如,通过拖动手指进行平移只调用开头的过程拖动动作)。这意味着永远不会使用新坐标调用该过程。
那么 - 这是正确的方法吗?
答案 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();
}
}