2012-04-03 25 views
5

Digamos que tiene un TextView que muestra un número como 0 y tiene un Button. Ahora, si el usuario presiona el botón, el número en el TextView aumentará por uno (esto sé cómo hacerlo) pero si el usuario presiona el botón y no lo suelta, entonces el número en el TextView debe aumentarse y esto debería repítelo siempre que el usuario no libere el Button. En otras palabras: ¿Cómo aumentar el número una y otra vez mientras el usuario mantenga presionado el botón?Repita una acción cuando se presiona el botón largo

Respuesta

6

Un enfoque general (no específico de Android) sería detectar la prensa y lanzar el evento por separado. El evento de prensa inicia una tarea periódica (Runnable o Thread) que se agrega al contador (digamos 5 veces por segundo o una vez cada 200 ms). El evento de lanzamiento detiene la tarea periódica.

1
  1. Establecer un View.OnLongClickListener para su botón
  2. Dé su actividad un Runnable, e inicializar (pero no lo inicie) cuando se carga la actividad
  3. Tener la OnLongClickListener haga su tarea asíncrona regular de actualización el cuadro de texto y verificando la hora desde que se hizo clic por primera vez
  4. Crea un OnTouchListener que pausa el Runnable cuando se libera el evento táctil.

Sé que es un borrador, pero este es un modelo muy útil para poder volver a usar y modificar, por lo que vale la pena que se hunde sus garras en él ...

+0

+1 Esto suena como el proceso específico de Android que estaba describiendo más genéricamente. –

2

que necesitará para programar una evento repetitivo asincrónico cuando recibe un evento mousePressed y lo detiene cuando recibe un evento mouseReleased.

Hay muchas maneras de manejar esto en Java. Me gusta usar las clases java.util.concurrent, que son bastante flexibles. Sin embargo, hay algunas cosas que se deben tener en cuenta:

Si sus eventos asincrónicos no ocurren en la secuencia de envío de evento, debe establecer el texto JButton usando SwingUtilities.invokeLater().

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.ScheduledFuture; 
import java.util.concurrent.TimeUnit; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Frame 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     final JButton button = new JButton("0"); 

     final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 

     button.addMouseListener(new MouseAdapter() 
     { 
      int counter = 0; 
      ScheduledFuture<?> future; 

      @Override 
      public void mousePressed(MouseEvent e) 
      { 
       Runnable runnable = new Runnable() 
       { 
        public void run() 
        { 
         SwingUtilities.invokeLater(new Runnable() 
         { 
          public void run() 
          { 
           button.setText(String.valueOf(counter++)); 
          } 
         }); 
        } 
       }; 

       future = executor.scheduleAtFixedRate(runnable, 0, 200, TimeUnit.MILLISECONDS); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) 
      { 
       if (future != null) 
       { 
        future.cancel(true); 
       } 
      } 

     }); 

     frame.add(button); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 
Cuestiones relacionadas