我正在尝试在 map 叠加层上放置一个标记,然后在用户选择可绘制对象时显示一个对话框。问题是事件似乎重叠。单击 map 并绘制标记后,onTap 会立即触发,因为我刚刚绘制了标记,它直接在 onTap 事件下,所以我的对话框总是会触发。有没有人对如何使这些事件相互排斥有任何建议?
这是 map Activity 的代码:
public class SelectGameLocation extends MapActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
private MapView mapView = null;
private SelectGameLocationItemizedOverlay selectLocationOverlay = null;
private List<Overlay> mapOverlays = null;
private GestureDetector gestureDetector = null;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
//set the layout
setContentView(R.layout.activity_select_game_location);
//configure activity for double clicks
gestureDetector = new GestureDetector(this);
gestureDetector.setOnDoubleTapListener(this);
//create and configure mapview
mapView = (MapView) findViewById(R.id.selectGameLocation);
mapView.setBuiltInZoomControls(true);
mapView.setHapticFeedbackEnabled(true);
//configure the overlay to draw the icons on the map
mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.map_icon);
selectLocationOverlay = new SelectGameLocationItemizedOverlay(drawable, this);
mapOverlays.add(selectLocationOverlay);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onDoubleTap(MotionEvent me) {
GeoPoint p = GeoPointHelper.getPointClicked(me, mapView);
mapView.getController().animateTo(p);
mapView.getController().zoomIn();
return true;
}
//Overridden methods but not used
@Override
public boolean onDoubleTapEvent(MotionEvent me) {
return false;
}
@Override
public boolean onDown(MotionEvent me) {
return false;
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapConfirmed(MotionEvent me) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent me) {
return false;
}
}
和覆盖类的代码:
public class SelectGameLocationItemizedOverlay extends ItemizedOverlay {
private Context context = null;
private List<OverlayItem> overlays = new ArrayList<OverlayItem>();
public SelectGameLocationItemizedOverlay(Drawable marker, Context context) {
super(boundCenterBottom(marker));
this.context = context;
}
@Override
protected boolean onTap(int index) {
OverlayItem itemClicked = overlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle(itemClicked.getTitle());
dialog.setMessage(itemClicked.getSnippet());
dialog.setCancelable(true);
dialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i(this.getClass().getName(), "Selected Yes To Add Location");
((SelectGameLocation) context).finish();
}
});
dialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i(this.getClass().getName(), "Selected No To Add Location");
dialog.cancel();
}
});
dialog.show();
return true;
}
@Override
public boolean onTouchEvent(MotionEvent me, MapView mapView) {
drawMarker(GeoPointHelper.getPointClicked(me, mapView));
return super.onTouchEvent(me, mapView);
}
private OverlayItem drawMarker(GeoPoint p) {
OverlayItem overlayitem = new OverlayItem(p, "Select As Game Location?", "Do you want this location to be added as the location for the game?");
getOverlays().clear();
addOverlay(overlayitem);
return overlayitem;
}
public List<OverlayItem> getOverlays() {
return overlays;
}
public void addOverlay(OverlayItem overlay) {
overlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i) {
return overlays.get(i);
}
@Override
public int size() {
return overlays.size();
}
}
最佳答案
我遇到了完全相同的问题,我的 onTouchEvent 向 map 添加了一个标记,并希望它在用户单击它时显示有关该标记的信息,它起作用了,但它还在其顶部添加了另一个标记。
所以我所做的不是使用 onTouchEvent,而是在 onTap(int index) 和 onTap(Geopoint p, MapView mapView) 中执行所有操作,如下所示:
public boolean onTap (final GeoPoint p, final MapView mapView){
boolean tapped = super.onTap(p, mapView);
if (tapped){
//do what you want to do when you hit an item
}
else{
//do what you want to do when you DON'T hit an item
}
return true;
}
//Return true in order to say that the listener has correctly taken the event into account
@Override
protected boolean onTap(int index) {
return true;
}
问候,
汤姆
关于Android:ItemizedOverlay onTouchEvent 和 onTap 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4971749/