2011-02-08 14 views
9

Por lo tanto, me gustaría poder reconocer gestos avanzados usando GestureOverlayView y OnGestureListener, así como también poder detectar pulsaciones dobles y pulsaciones largas utilizando GestureDetector. Tengo ambas funciones trabajando bien por separado en dos proyectos diferentes. Sin embargo, estoy tratando de combinarlos y tengo algunos problemas. Parece que cuando intento presionar dos veces/presionar, no se reconoce porque GestureOverlayView cubre toda la pantalla y solo reconocerá los gestos avanzados definidos en Gesture Builder. ¿Alguien sabe cómo configurar GestureOverlayView para que permita a GestureDetector hacer su trabajo? Mi código:GestureOverlayView y Double-Tap

public class HelloAndroid extends Activity implements OnGesturePerformedListener, OnDoubleTapListener, OnGestureListener { 
/** Called when the activity is first created. */ 
private GestureLibrary mLibrary; 
private GestureDetector detector; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 
    if (!mLibrary.load()) { 
     finish(); 
    } 

    GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures); 
    gestures.addOnGesturePerformedListener(this); 

    detector = new GestureDetector(this, this);\ 

Y el xml ...

<?xml version="1.0" encoding="utf-8"?> 

<android.gesture.GestureOverlayView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/gestures" 
     android:layout_width="fill_parent" 
     android:visibility="invisible" 
     android:layout_height="fill_parent"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
    <TextView 
     android:id="@+id/text1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" 
     /> 
    </LinearLayout>  
</android.gesture.GestureOverlayView> 

Gracias de antemano!

Respuesta

3

Lo hice, pero no estoy seguro si mi solución funcionará para usted. ¿Necesita detectar el doble toque y la pulsación larga en toda la actividad o solo en su lista?

En mi proyecto, lo que tengo es, por supuesto, que GestureOverlayView lo envuelve todo, pero mi GestureDetector fue asignado solo en el contenedor en el que quiero manejar esos eventos, específicamente en una cuadrícula con miniaturas.

En realidad, mi detector de gesto es el interior de una View.OnTouchListener

public class TouchListener implements View.OnTouchListener { 

    Rect rect = new Rect(); 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     gestureDetector.onTouchEvent(event); 
     // We do not use the return value of 
     // mGestureDetector.onTouchEvent because we will not receive 
     // the "up" event if we return false for the "down" event. 
    // false is returned so children views can receive touch event too. 
     return false; 
} 

    private View getViewAt(int x, int y) { 
    // I need to know which thumbnail was selected 
    } 

    GestureDetector gestureDetector = new GestureDetector(new SimpleOnGestureListener() { 
     @Override 
     public void onLongPress(MotionEvent e) {…} 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) {…} 
     @Override 
     public boolean onDoubleTap(MotionEvent e) {...} 

}); 

}

Entonces sólo tiene que asignar este oyente toque a mi red. En tu caso, puede usarse en tu lista.

mGrid.setOnTouchListener(new TouchListener()); 

Lo que pasa es que GesturOverlayView se propagará a eventos de toque vistas interiores, mientras que no se detecta un gesto. La solución es crear un touchlistener a la vista que necesita para detectar gestos simples usando GestureDetector en el método listener onTouch. Espero que te pueda ayudar.

+0

Esto realmente funcionó. Gracias ! –

0

El problema proviene del método en EventoTouch (evento) de su actividad que no se llama porque el evento es interceptado por GestureOverlayView.

Si desea obtener este evento en su actividad, es posible que desee sobrescribir el método dispatchTouchEvent (evento).

En su caso, este código puede trabajar:

@Override 
public boolean dispatchTouchEvent(MotionEvent e) 
{ 
    detector.onTouchEvent(e); 

    return super.dispatchTouchEvent(e); 
} 
0

que estaba teniendo el mismo problema.

GestureOverlayView intercepta el evento onTouchEvent. Así que acaba de establecer

android:eventsInterceptionEnabled="false" 

El resultado debería ser algo como esto:

<android.gesture.GestureOverlayView 
     android:id="@+id/gestures" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:eventsInterceptionEnabled="false" > 
0

que estaba teniendo el algún problema. Encontré una solución, pero no sé por qué funciona.

Uso el método dispathTouchEvent pero invoco onTouchEvent() con mi instancia GestureDetector.

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) 
{ 
    this.myGestureDetector.onTouchEvent(ev); 
    return super.dispatchTouchEvent(ev); 
} 
Cuestiones relacionadas