【发布时间】:2013-06-17 20:54:58
【问题描述】:
我正在尝试为 google 地图片段设置 onDrag 侦听器,但无法触发拖动事件。由于地图不直接支持拖动事件,我正在尝试为视图实现拖动侦听器。我知道 onMarkerDrag 事件,但这对我没有好处,因为我不想移动标记。
捕获地图拖动事件的原因有两个:
首先检测用户是否平移了地图。如果他们没有,我喜欢将他们的位置保留在屏幕上,如果它不在地图上,则动画到他们的位置。如果他们已经平移了地图,我假设他们知道他们想看到什么并在屏幕上强制定位。 (这似乎应该包含在 API 中)
陷印的第二个原因是允许用户在地图上绘制线和多边形。我可以通过 onTap 事件(添加点)来做到这一点,但我也希望能够让他们徒手操作。
我的代码如下所示:
主活动:
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
setUpMapIfNeeded();
mMapView = findViewById(R.id.map);
myMapDragListener = new MapDragListener();
mMapView.setOnDragListener(myMapDragListener);
聆听者:
public class MapDragListener implements OnDragListener {
/**
*
*/
public MapDragListener() {
super();
say.logCat("MapDragListener: I'm ALIVE!!!!");
}
private AkamaiAnnounce say = new AkamaiAnnounce();
private boolean inDrag;
private boolean hasPanned=false;
@Override
public boolean onDrag(View v, DragEvent event) {
say.logCat("MapDragListener.onDrag: " + event.toString());
//String dotTAG = (String) getTag();
if (event.getLocalState() != this) {
return false;
}
boolean myResult = true;
int action = event.getAction();
float x = event.getX();
float y = event.getY();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
inDrag = true;
break;
case DragEvent.ACTION_DRAG_LOCATION:
break;
case DragEvent.ACTION_DRAG_ENTERED:
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DROP:
myResult = false;
break;
case DragEvent.ACTION_DRAG_ENDED:
inDrag = false; // change color of original dot back
hasPanned=true;
break;
default:
myResult = false;
break;
}
return false;
//return myResult;
}
public boolean hasPanned() {
return hasPanned;
}
public void setHasPanned(boolean hasPanned) {
this.hasPanned = hasPanned;
}
}
地图工作正常。侦听器实例化,但我的 onDrag 事件永远不会触发。有什么想法吗?
【问题讨论】:
-
如果你在谈论拖动标记,v2 肯定有拖动监听器。使用
implements OnMarkerDragListener -
@tyczj 这不是拖动标记,而是平移整个地图。 Tim:这行不通,因为 map 会消耗事件。更新您的问题,说出您想要实现的目标,也许我们可以找到解决方案。
标签: android google-maps drag google-maps-android-api-2