Cómo utilizar View.OnTouchListener en lugar de onClick

Estoy desarrollando una aplicación Android 2.2.2 para un cliente y él quiere hacer lo siguiente:

Ahora tengo un botón con un evento onClick pero no le gusta, quiere dectectar cuando el usuario suelte el botón.

He encontrado View.OnTouchListener que creo que esto es lo que necesito usar pero, ¿hay alguna posibilidad de agregar este evento a xml como hice con onClick?

<ImageButton android:id="@+id/btnSaveNewGate" android:layout_width="@dimen/btnSaveNewGate_width" android:layout_height="@dimen/btnSaveNewGate_height" android:layout_below="@+id/radioGrGateType" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/btnSaveNewGate_marginTop" android:background="@null" android:contentDescription="@string/layout_empty" android:onClick="onSaveNewGateClick" android:scaleType="fitXY" android:src="@drawable/save_gate_selector" /> 

Tengo dos preguntas más:

¿Cuál es el evento asociado cuando el usuario suelta su dedo?

¿Hay alguna guía que prohíbe usar View.OnTouchListener lugar de onClick ?

El evento cuando el usuario suelta su dedo es MotionEvent.ACTION_UP . No estoy enterado si hay algunas pautas que prohíban usar View.OnTouchListener en vez de onClick (), lo más probablemente depende de la situación.

He aquí un ejemplo de código:

 imageButton.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP){ // Do what you want return true; } return false; } }); 

OnClick se activa cuando el usuario libera el botón. Pero si todavía quieres usar el TouchListener necesitas agregarlo en código. Es sólo:

 myView.setOnTouchListener(new View.OnTouchListener() { // Implementation; }); 

Presumiblemente, si se quiere usar un OnTouchListener lugar de OnClickListener , entonces se necesita la funcionalidad adicional del OnTouchListener . Esta es una respuesta suplementaria para mostrar más detalles sobre cómo se puede utilizar OnTouchListener .

Definir el oyente

Pon esto en alguna parte de tu actividad o fragmento.

 private View.OnTouchListener handleTouch = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.i("TAG", "touched down"); break; case MotionEvent.ACTION_MOVE: Log.i("TAG", "moving: (" + x + ", " + y + ")"); break; case MotionEvent.ACTION_UP: Log.i("TAG", "touched up"); break; } return true; } }; 

Establecer el oyente

Establezca el listener en onCreate (para una actividad) o onCreateView (para un fragmento).

 myView.setOnTouchListener(handleTouch); 

Notas

  • getX y getY dan las coordenadas relativas a la vista (es decir, la esquina superior izquierda de la vista). Serán negativos cuando se mueva arriba oa la izquierda de su vista. Use getRawX y getRawY si desea las coordenadas absolutas de pantalla.
  • Puede usar los valores de x e y para determinar cosas como la dirección de desplazamiento.
  • Android Phonegap y Fragmentos
  • Desactivar / filtrar cualquier evento táctil para un diseño
  • Modifique el estilo de los elementos Android en la barra ActionBar
  • ANDROID: divide la pantalla en 2 partes iguales con 2 listas
  • Android ImageView NullPointerException
  • Facebook Dialog en android No viene
  • Animación del tamaño de texto de TextView de Android y no de TextView
  • ¿Cómo usar textview.getLayout ()? Devuelve null
  • Actividad de Android ha filtrado ventana com.android.internal.policy.impl.phonewindow $ decorview Issue
  • RequestFocus no funciona correctamente para EditText
  • Existe un archivo XML Layout de Android Studio pero no lo encuentro
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.