2012-05-09 23 views
20

Quiero implementar la acción de repetición al presionar y mantener presionado un botón. Ejemplo: cuando un usuario hace clic en un botón y lo mantiene presionado, debe llamar a un método similar una y otra vez en un intervalo fijo hasta que el usuario retire su dedo del botón.acción de repetición de android al presionar y mantener presionado un botón

+3

Pero es la necesidad de mi aplicación. Quiero mover el cursor constantemente mientras el usuario sostiene el botón. Está funcionando bien para cada toque. Solo quiero repetir la acción mientras el usuario sostiene el botón. –

+2

@JoxTraex: por favor, detalla tu punto de vista en una respuesta, y observa cuántas votaciones ascendentes se obtienen. –

Respuesta

59

Existen varias formas de lograr esto, pero una muy sencilla sería publicar un Runnable en un Handler con un cierto retraso. En su forma más básica, que se verá algo como esto:

Button button = (Button) findViewById(R.id.button); 
button.setOnTouchListener(new View.OnTouchListener() { 

    private Handler mHandler; 

    @Override public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      if (mHandler != null) return true; 
      mHandler = new Handler(); 
      mHandler.postDelayed(mAction, 500); 
      break; 
     case MotionEvent.ACTION_UP: 
      if (mHandler == null) return true; 
      mHandler.removeCallbacks(mAction); 
      mHandler = null; 
      break; 
     } 
     return false; 
    } 

    Runnable mAction = new Runnable() { 
     @Override public void run() { 
      System.out.println("Performing action..."); 
      mHandler.postDelayed(this, 500); 
     } 
    }; 

}); 

La idea es bastante simple: enviar un Runnable que contiene la acción repetida en un Handler cuando se produce la acción toque 'abajo'. Después de eso, no publique Runnable nuevamente hasta que la acción táctil 'arriba' haya pasado. El Runnable se seguirá publicando en el Handler (mientras que la acción táctil 'hacia abajo' todavía está ocurriendo), hasta que se elimine mediante la acción de retoque; eso es lo que habilita el aspecto de "repetición".

Dependiendo del comportamiento real del botón y su onclick/ontouch que está buscando, es posible que desee hacer la publicación inicial sin demora.

+0

si quiero hacer algo extra cuando el usuario retiene el botón, digamos 5 segundos, ¿cómo puedo reconocer que el usuario está presionando el botón durante 5 segundos. –

+0

Podrías empujar otro 'Runnable' retrasado al' Handler'. Si se trata de un evento único, simplemente no lo publique nuevamente desde el 'Runnable'. Además, no olvides quitarlo en la acción 'arriba', en caso de que el botón se suelte antes de que hayan transcurrido esos 5 segundos. –

+0

Abajo el voto ya que los ascensores fuera del área del botón continuarán disparando el controlador. ACTION_CANCEL se requiere como mínimo como un fracaso en ACTION_UP. Desafortunadamente, si el botón está en una vista de desplazamiento u otro widget desplazable, este código puede hacer que parezca que el widget tocado todavía se mantiene aunque esté fuera de la pantalla o lejos del dedo del usuario. –

0

Puede registrar un View.OnKeyListener para esa vista. Por favor, tenga en cuenta que es mejor reblandecer tales devoluciones de llamadas, de lo contrario, en caso de que su método haga algo incluso un poco "pesado", la interfaz de usuario no será fluida.

1

Aunque no es una gran idea. Se puede lograr iniciando un temporizador en onKeyDown para disparar en un intervalo durante el cual mueva el cursor un paso y reinicie el temporizador. A continuación, puede cancelar el temporizador en el evento onKeyUp. La forma en que esto funciona en otros sistemas es, por lo general, mover la primera tecla hacia abajo y luego esperar un poco para asegurarse de que el usuario está sosteniendo definitivamente el botón ... entonces la repetición puede ser un poco más rápida. Piensa en la repetición automática de un teclado. Esto debería funcionar y no debería afectar negativamente al hilo de la interfaz de usuario.

+0

¿Por qué dices que no es una gran idea? – Suragch

Cuestiones relacionadas