2012-07-27 18 views
32

Estoy desarrollando una aplicación para Android 2.2.2 para un cliente y lo que quiere hacer lo siguiente:Cómo utilizar View.OnTouchListener en lugar de onClick

Ahora tengo un botón con un evento de clic, pero él no' Me gusta, quiere detectar cuando el usuario suelta 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 lo 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 al usuario suelta el dedo?

¿Existen directrices que prohíban el uso de View.OnTouchListener en lugar de onClick?

Respuesta

54

El evento cuando el usuario suelta el dedo es MotionEvent.ACTION_UP. No sé si existen pautas que prohíban el uso de View.OnTouchListener en lugar de onClick(), lo más probable es que dependa de la situación.

Aquí está 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; 
    } 
}); 
+4

Alternativamente puede utilizar un interruptor en event.getAction() y los casos serían MotionEvent.ACTION_UP, MotionEvent.ACTION_DOWN y así sucesivamente. –

+1

en uno más uno, muestra MotionEvent.ACTION_DOWN en lugar de hacer clic en – lionheart

+0

Tenga en cuenta que si devuelve false allí, la cláusula if nunca se activará. Ver: https://stackoverflow.com/a/20359888/564628 –

5

OnClick se activa cuando el usuario suelta el botón. Pero si aún desea utilizar el TouchListener, debe agregarlo en el código. Es sólo:

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

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

Definir el oyente

Ponga esto en alguna parte en su 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

Ajuste al oyente en onCreate (para una actividad) o onCreateView (para un fragmento).

myView.setOnTouchListener(handleTouch); 

Notas

  • getX y getY le dan las coordenadas relativas a la vista (es decir, la esquina izquierda superior de la vista). Serán negativos cuando se mueva arriba o hacia la izquierda de su vista. Use getRawX y getRawY si desea las coordenadas absolutas de la pantalla.
  • Puede usar los valores x y y para determinar aspectos como la dirección del deslizamiento.
Cuestiones relacionadas