Android: ItemizedOverlay onTouchEvent y onTap se superponen

Estoy tratando de colocar un marcador en una superposición de mapa y luego presentar un diálogo cuando el usuario selecciona el dibujable. El problema es que los eventos parecen superponerse. Después de hacer clic en el mapa y el marcador se dibuja, el onTap dispara inmediatamente después, y porque acabo de dibujar el marcador, está directamente bajo el evento onTap, por lo que mi diálogo siempre se activa. ¿Alguien tiene alguna sugerencia sobre cómo hacer que estos eventos se excluyan mutuamente?

Aquí está el código para la actividad del mapa:

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; } } 

y el código para la clase overlay:

 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(); } } 

Tenía exactamente el mismo problema, mi onTouchEvent añadido un marcador a un mapa, y quería que mostrar información sobre ese marcador cuando el usuario hace clic en él, funcionó, pero también añadió otro marcador en la parte superior de la misma.

Así que lo que hice no era usar onTouchEvent pero hacer todo en onTap (int index) y onTap (Geopoint p, MapView mapView) así:

 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; } 

Saludos,

Tom

Si está actualizando la superposición anterior, establezca isFirst=true; en la llamada a `remove () para eliminar la superposición en cuestión.

En la llamada onTap() , utilice

 if(isFirst) { isFirst=false; } else{ // the actual onTap() comes here } 

Espero que funcione igual si isFirst=true se establece en el onDraw() también.

Creo que el problema es fundamentalmente que el onTap es un onTouchEvent particular, por lo que si escribes ambos en la superposición, ambos son disparados al tocar el mapa

Puede intentar agregar un nuevo elemento de superposición en uno de los eventos táctiles que implementó en su mapActivity y dejar el evento onTap en la superposición tal como está ahora

podría funcionar de esta manera, pero tienes que probar, no estoy seguro!

  • Cómo dibujar polígono mano libre en Google mapa V2 en Android?
  • ¿Hay algún límite para dibujar la ruta usando Geocoder (Android)?
  • Disposición de Android: coloca una vista entre dos vistas
  • ¿Hay alguna forma de que los elementos de la interfaz de usuario se superpongan ligeramente (uno encima del otro) sin usar diseños absolutos?
  • Dibuja una ruta en los mapas siguiendo la ruta de movimiento de los dedos en la pantalla del dispositivo
  • ¿Por qué mi sistema se superpone capturando todos los toques (no es posible interacción con la vista subyacente)
  • Colocar una vista de imagen como imagen de superposición en la vista previa de la cámara
  • Cómo obtener el largo y lat valor de cuatro esquinas en el mapa en android?
  • Color de relieve de superposición de círculo no dibujado siempre en Google Maps v2
  • Custom OverlayItem sin dibujar
  • Pantalla emergente / superpuesta en panal de android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.