2011-05-31 16 views
12

Estoy trabajando en la aplicación en la que un usuario necesita mantener presionado un botón durante mucho tiempo.Android - Detectar Fin de Presión Larga

¿Cómo puedo detectar el momento en que el usuario: termina la prensa o mueve su posición táctil?

Gracias

+0

Necesita explicar más por qué la posición de usuario en movimiento es importante. En cuanto a detectar el final de una pulsación larga, simplemente use setOnLongClickListener(). El método onLongClick() se invocará automáticamente cuando el usuario suelte el botón. – Squonk

+2

Eso está mal: el método onLongClick se activa tan pronto como se detecta un clic largo, es decir, tan pronto como se produce el tiempo de espera para un "clic largo", NO cuando el usuario suelta el botón. –

Respuesta

37

Creo que su mejor opción es utilizar una combinación de onLongClickListener() y onTouchListener() para ese botón. Tendrá que atrapar ciertos eventos en el oyente táctil, ya que se activará para cada evento táctil.

intentar algo así como lo siguiente:

class Blah extends Activity { 
    private Button mSpeak; 
    private boolean isSpeakButtonLongPressed = false; 

    @Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      setContentView(R.layout.blahlayout); 
      Button mSpeak = (Button)findViewById(R.id.speakbutton); 
      mSpeak.setOnLongClickListener(speakHoldListener); 
      mSpeak.setOnTouchListener(speakTouchListener); 
    } 

    private View.OnLongClickListener speakHoldListener = new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View pView) { 
       // Do something when your hold starts here. 
       isSpeakButtonLongPressed = true; 
       return true; 
      } 
    } 

    private View.OnTouchListener speakTouchListener = new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View pView, MotionEvent pEvent) { 
       pView.onTouchEvent(pEvent); 
       // We're only interested in when the button is released. 
       if (pEvent.getAction() == MotionEvent.ACTION_UP) { 
        // We're only interested in anything if our speak button is currently pressed. 
        if (isSpeakButtonLongPressed) { 
         // Do something when the button is released. 
         isSpeakButtonLongPressed = false; 
        } 
       } 
       return false; 
      } 
    } 
} 
+0

Esto funcionó para mí, gracias! –

+0

Gracias John, gran solución. – alfdev

+3

Cuando presioné durante mucho tiempo el botón, la acción se ejecutó dos veces, lo arreglé devolviendo true en lugar de falso dentro de onTouchListener. – DAVIDBALAS1

2

Estas respuestas son bastante complicado. onClick de un OnClickListener todavía se llama al final de una pulsación larga si devuelve false. Ese es el lugar más fácil para detectar el final de una pulsación larga.

Esto es especialmente importante saber porque si se implementa la ruta onTouch cuando regresaba false de onLongClick (el valor por defecto a medida que da y con frecuencia lo que quiere), su código onClick puede llamarse al final de sus largas prensas sin ti dándome cuenta.

Aquí es un ejemplo basado en la captura de una foto o un vídeo:

private boolean takingVideo = false; 

captureButton.setOnClickListener(v -> { 
    // onClick gets called after normal click or long click 
    if(takingVideo) { 
     saveVideo(); 
    } else { 
     takePhoto(); 
    } 
}); 

captureButton.setOnLongClickListener(v -> { 
    takeVideo(); 

    return false; 
}); 

private void takePhoto() { 
    // Save the photo 
} 

private void takeVideo() { 
    takingVideo = true; 
    // Start capturing video 
} 

private void saveVideo() { 
    takingVideo = false; 
    // Save the video 
} 

Como se puede ver, la lógica se vuelve muy sencillo cuando se deja Android propagar el evento toque final a un OnClickListener.

Cuestiones relacionadas