2011-01-26 11 views
11

Tengo un MapView en una actividad y funciona bien, el mapa muestra, y responde a grifos, y puedo extraer la ubicación fácilmente. Sin embargo, este controlador también está respondiendo al zoom de pellizco, por lo que si un usuario intenta pellizcar-acercar, la aplicación responde como si hubieran tocado (y es muy confuso para ellos).¿Cómo respondo a un toque en una Vista de mapa de Android, pero ignoro el zoom de pellizco?

¿Cómo puedo responder a los toques en un MapView y solo elegir un solo toque, ignorando específicamente el pellizco-zoom y el doble de los toques?

¿Debo utilizar OnTouchEvent() en lugar de OnTap()? En caso afirmativo, ¿cómo distingo entre los diferentes eventos táctiles y cómo accedo al GeoPoint?

Aquí está el código desde el interior de mi MapActivity:

class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean onTap(GeoPoint p, MapView map) 
    { 
     if (p!=null) 
     { 
      // Do stuff with the geopoint 
      return true;         // We handled the tap 
     } 
     else 
     { 
      return false;        // We didn't handle the tap 
     } 
    } 
} 
+0

Es posible que pueda seguir usando ONTAP, que está diseñado sólo para responder cuando los elementos de superposición están intervenidos (en oposición a cualquier punto del mapa), y todavía establecen un oyente toque en la MapView hacer caso omiso de pellizco, como esto: http://stackoverflow.com/questions/4626028/how-to-disable-pinch-in-android-mapview –

+0

Curiosamente, arrastrar el mapa está bien. entonces Drag no dispara en Toque() pero toca (como se esperaba) pero también pellizca y acerca. No es lo que hubiera esperado. –

+0

No quiero deshabilitar el pellizco y el zoom, quiero que funcione, solo quiero que mi aplicación también recoja el onTap. –

Respuesta

27

Después de mucho rascarse la cabeza y tratando diversos enfoques, éste está funcionando bien hasta ahora. El código sigue los eventos de movimiento. Cuando obtenemos un evento ACTION_DOWN, marca el indicador isPinch como falso (no sabemos si es un pellizco o aún no), pero tan pronto como tengamos un evento táctil (es decir, ACTION_MOVE) que involucre dos dedos, isPinch está configurado para true, y así cuando el evento onTap() se dispara, puede ver si hubo un pellizco o no.

class MapOverlay extends com.google.android.maps.Overlay 
{ 
private boolean isPinch = false; 

@Override 
public boolean onTap(GeoPoint p, MapView map){ 
    if (isPinch){ 
     return false; 
    }else{ 
     Log.i(TAG,"TAP!"); 
     if (p!=null){ 
      handleGeoPoint(p); 
      return true;   // We handled the tap 
     }else{ 
      return false;   // Null GeoPoint 
     } 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent e, MapView mapView) 
{ 
    int fingers = e.getPointerCount(); 
    if(e.getAction()==MotionEvent.ACTION_DOWN){ 
     isPinch=false; // Touch DOWN, don't know if it's a pinch yet 
    } 
    if(e.getAction()==MotionEvent.ACTION_MOVE && fingers==2){ 
     isPinch=true; // Two fingers, def a pinch 
    } 
    return super.onTouchEvent(e,mapView); 
} 

} 
+0

¡Maravilloso! Exactamente lo que estaba buscando. ¡Te daría +2! :) – Kimi

+0

+1 perfecto, gracias :) – Dori

+0

¡Gracias, encontré esta pregunta incluso antes de darme cuenta de que tenía exactamente el mismo problema! Es bueno tener la solución de inmediato =) –

Cuestiones relacionadas