Android, gestos sobre los widgets que se pueden hacer clic

Mi aplicación contiene un área llena de botones. Deseo implementar la actividad de tal manera, que el gesto de fling sobre el área del botón lo cambiaría a uno de dos otras áreas (usando ViewFlipper).

He hecho dos aproximaciones para detectar gestos. La primera implicó el uso de GestureDetector. Sin embargo, los eventos de movimiento táctil sobre el botón no aumentaron el método de actividad onTouchEvent, por lo que en el resultado – no podría haber enviado a la clase GestureDetector. Un fracaso, en definitiva.

El segundo enfoque – implicó el uso de GestureOverlayView. Esta vez, sin embargo, he alcanzado el segundo extremo: no sólo el gesto fue detectado, sino también el botón, sobre el que se realiza el gesto, informó un clic.

Deseo que la interfaz funcione de la siguiente manera: si el usuario toca el botón y libera el tacto (o mueve el dedo sólo un poco), el botón informa de clic y no se detecta ningún gesto. Por otra parte, si el usuario toca la pantalla y hace un movimiento más largo, el gesto será detectado y ningún evento de clic informado por el botón.

He implementado una pequeña aplicación de prueba de concepto. El código XML de la actividad es el siguiente:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"> <android.gesture.GestureOverlayView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/overlay"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/display" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/button"/> </LinearLayout> </android.gesture.GestureOverlayView> </LinearLayout> 

El código de actividad java sigue:

 package spk.sketchbook; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.gesture.*; import android.gesture.GestureOverlayView.OnGestureListener; public class Main extends Activity implements OnGestureListener, OnClickListener { private void SetupEvents() { GestureOverlayView ov = (GestureOverlayView)findViewById(R.id.overlay); ov.addOnGestureListener(this); Button b = (Button)findViewById(R.id.button); b.setOnClickListener(this); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SetupEvents(); } @Override public void onGesture(GestureOverlayView arg0, MotionEvent arg1) { TextView tv = (TextView)findViewById(R.id.display); tv.setText("Gesture"); } @Override public void onGestureCancelled(GestureOverlayView arg0, MotionEvent arg1) { } @Override public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) { } @Override public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) { } @Override public void onClick(View v) { TextView tv = (TextView)findViewById(R.id.display); tv.setText("Click"); } } 

La pregunta es: ¿cómo implementar una interfaz de este tipo, que puede decidir, si la acción del usuario se tratará como el gesto o haga clic en el botón?

Saludos cordiales – Spook.

Me resolví. La idea es capturar eventos gestuales desde GestureOverlayView y, además de pasarlos a GestureDetector, mida la distancia del gesto del usuario. La distancia se almacenará en el campo de una actividad privada (así disponible para todos los manejadores de eventos). Finalmente, los manipuladores de fling y clic deben comprobar el valor de este campo; Si está por debajo de cierto valor (por ejemplo, 10 píxeles estarán bien), debe interpretarse como un clic. De lo contrario – como un gesto.

Tenga en cuenta que el botón se verá y se llamará a su controlador de clics. He decidido crear un manejador de clics de bajo nivel (adjunto a todos los botones de GestureOverlayView), que hace el gesto / haga clic en comprobar y si el resultado es un clic, elige uno de los controladores de clics de nivel superior.

La solución funciona para mí; Sin embargo, si se desea desactivar el aspecto de clic del botón y evitar que el controlador se llame, probablemente implicaría redefinir el botón y / o los componentes de GestureOverlayView.

AnOther Solution: Realiza esta función:

 public void SetSwipe(View v, final GestureDetector gestureScanner){ // Sets scroll view listener v.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureScanner.onTouchEvent(event)) return true; else return false; } }); } 

Y llámelo para cada Widget de la siguiente manera:

 scfSetTag.SetSwipe(svAllView, gestureScanner); 

Si necesita hacer esto a partir de muchas actividades o fragmentos, puede crear un archivo class.java e instanciar esta clase en cada actividad que necesite implementar el desplazamiento. Esto detecta tanto deslizar un clic en cualquier witdget. Espero ayuda!

  • Android: refleja el cambio de idioma de la interfaz de usuario en el momento de la ejecución sin recargar / reiniciar la aplicación
  • Cómo deshabilitar una pestaña en la pantalla de Android?
  • Android Listview Flotante Primera fila
  • Androide: pregunta LinearLayout y fill_parent simple
  • Android GUI - ¿Cómo forzar un botón a la siguiente línea?
  • desarrollo html para android mobile
  • Android seekbar cómo bloquear el arrastrar / deshabilitar por poco tiempo
  • Actividad de Android sin GUI
  • Facebook Slide menu-slide a la derecha en android?
  • Android: construir la aplicación nativa GUI con NDK?
  • ¿Es una mala práctica utilizar márgenes negativos en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.