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:
- Dibujar una superposición similar a MapsApp
- Barra de herramientas Android superpuesta TabLayout en CollapsingToolbarLayout
- Widget flotante / superposición en el lanzador de Android
- Superposiciones de mapa más eficientes en Android
- Mostrar un bus móvil en google maps api v2 android
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(); } }
- ¿Cómo expandir el marcador de superposición en Google Maps?
- Cómo dibujar polígono mano libre en Google mapa V2 en Android?
- Especifique Layout Margen superior para la barra de acción de superposición
- ¿Por qué mi sistema se superpone capturando todos los toques (no es posible interacción con la vista subyacente)
- Superponer imagen para hacer tutorial en la aplicación para Android
- Entender boundCenterBottom ()
- Android cómo dibujar la pintura en mano libre en MapView con superposición?
- Pantalla emergente / superpuesta en panal de android
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!