Vista personalizada con botones implementa OnGestureListener

He estado rompiendo mi cabeza durante el último par de horas, googled el infierno de google y ninguno de los ejemplos en StackOverflow u otros lugares trabajó para mí, así que aquí va …

Tengo una vista personalizada, que extends LinearLayout and implements GestureDetector.OnGestureListener .

En mi diseño personalizado tengo 3 botones, cada uno tiene un oyente de clic. Lo que quiero es poder Fling por todas partes en la vista para realizar algo, pero también para poder hacer clic en los botones.

Mi función onFling funciona muy bien si me arrojo dentro de la vista, pero no sobre uno de los botones. Si vuelvo sobre uno de los botones, realizar un clic en la mayoría de los casos o nada en algunos.

Aquí está la parte relevante de mi código:

 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { return false; } // right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { viewFlipper.setInAnimation(slideLeftIn); viewFlipper.setOutAnimation(slideLeftOut); viewFlipper.showNext(); return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { viewFlipper.setInAnimation(slideRightIn); viewFlipper.setOutAnimation(slideRightOut); viewFlipper.showPrevious(); return true; } return false; } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return true; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return gestureDetector.onTouchEvent(event); } return false; } 

Probado cualquier combinación de true retorno; falso retorno; Podría pensar en … Apreciaría cualquier ayuda! 🙂

¡Gracias!

Esto es lo que lo solucionó para mí eventualmente … (sólo el código modificado de mi pregunta). No estoy seguro si es la mejor solución, pero funciona:

 @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onTouchEvent(MotionEvent e) { return gestureDetector.onTouchEvent(e); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { return onTouchEvent(e); } 

Esto permitirá que el gesto fling, incluso sobre los botones y también permiten un simple clic en los botones, pero si tiene otra vista con botones detrás de esta vista, a veces los clics se pasa hacia atrás y realizar onClick en los botones detrás de la vista. La solución para esto es añadir "android:clickable="true" al diseño raíz de la vista frontal (LinearLayout, FrameLayout o lo que sea).

Esta es una respuesta que puede ser relevante para la situación que describe https://stackoverflow.com/a/9182176/780700

Tal vez usted podría establecer una superposición con SurfaceView en el que maneja todos los comentarios: http://developer.android.com/reference/android/view/SurfaceView.html

Con la surfaceView en la parte superior, sus botones deben todavía trabajar y sus lanzamientos deben poder conseguir sobre los botones sin ningunos problemas.

  • Android: Transparente WebView sobre previsualización de cámara
  • Cómo cambiar el color del marcador actual de la pestaña en Android ViewPager?
  • ¿Cuándo sabemos cuándo se han establecido las opiniones de una actividad
  • Android.view.InflateException al usar selectableItemBackground
  • ¿Hay una manera de obtener el diseño de la actividad actual y las vistas a través de adb?
  • ¿Cuál es la forma correcta de implementar un GridViewPager en Android Wear?
  • ¿Cómo puede una vista detectar cuando se está conectando a su padre?
  • Android windowSoftInputMode = "adjustPan" desplazarse un poco más
  • ¿Es posible tomar una captura de pantalla de una vista, sin mostrar la vista?
  • En la vista Web de Android, ¿puedo modificar el DOM de una página web?
  • Android - Compuesto personalizado generado dinámicamente Ver recreado en RecyclerView, causando un rendimiento bajo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.