Uso de GestureLibrary con ScrollView

Como he mencionado en el título, la aplicación tiene un ScrollView y un GestureDetector también. Fuera de los eventos táctiles de ScrollView, GestureDetector maneja acciones de deslizamiento como de izquierda a derecha y de derecha a izquierda. Todos están trabajando bien.

Ahora quiero añadir una GestureLibrary media GestureLibrary a Activity. He mirado fuentes diferentes y de alguna manera agregado correctamente. Simplemente, el diseño se ve así:

 <android.gesture.GestureOverlayView android:id="@+id/gOverlay" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ScrollView android:id="@+id/content_scroll" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scrollbars="none"> </ScrollView> <!-- Other views --> </android.gesture.GestureOverlayView> 

Está dibujando como quería (la línea amarilla) pero no está desencadenando ningún método. Aquí cómo implementé OnGesturePerformedListener :

  /* * Gestures */ gLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); if (!gLibrary.load()) { finish(); } GestureOverlayView gestureOverlayView = (GestureOverlayView) findViewById(R.id.gOverlay); gestureOverlayView.addOnGesturePerformedListener(gestureListener); 

Y aquí está gestureListener :

 private OnGesturePerformedListener gestureListener = new OnGesturePerformedListener() { public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { ArrayList<Prediction> predictions = gLibrary.recognize(gesture); if (predictions.size() > 1) { for(Prediction prediction: predictions){ Log.d("Test", "Looking for gestures"); } } } }; 

Eso es todo. Por la pared, intenté este código fuente con en la actividad diferente que no tiene ScrollView y que trabaja muy bien.

Por último, no estoy seguro de que se trata de GestureDetector, por lo que es la forma en la aplicación de detector:

 public boolean dispatchTouchEvent(MotionEvent ev) { if (detector != null) { if (detector.onTouchEvent(ev)) { return true; } } return super.dispatchTouchEvent(ev); } 

Y mi SwipeDetector :

 private class SwipeDetector extends SimpleOnGestureListener { private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_MAX_OFF_PATH = 250; private static final int SWIPE_THRESHOLD_VELOCITY = 200; public boolean onFling(android.view.MotionEvent e1, android.view.MotionEvent e2, float velocityX, float velocityY) { if( Math.abs( e1.getY() - e2.getY() ) > SWIPE_MAX_OFF_PATH ) { return false; } if( e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs( velocityX ) > SWIPE_THRESHOLD_VELOCITY ) { return false; } if( e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs( velocityX ) > SWIPE_THRESHOLD_VELOCITY ) { filterButton.performClick();return true; } return false; } } 

¿Qué hay de malo con mi enfoque?

Todos los eventos táctiles en android van desde los niños a los padres. Así, la vista de desplazamiento maneja todos los eventos de toque, y el detector de gestos no los recibe. Puede establecer el oyente táctil en ScrollView :

  scrollView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (detector != null) { return detector.onTouchEvent(event); return false; } }); 

Debe comprobar que el desplazamiento funciona según sea necesario y no se consumen los eventos de desplazamiento.

  • Android: ¿Cómo / dónde colocar código de gesto en IME?
  • Reemplazar plantillas de biblioteca de gestos en android
  • Smartphone acelerómetro gestos algoritmos
  • ¿Cómo simular un evento de toque en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.