2012-04-03 18 views
5

Supponiamo di avere un TextView che visualizza un numero come 0 e si dispone di un Button. Ora se l'utente preme il pulsante il numero nel TextView aumenterà per uno (questo so come fare) ma se l'utente preme il pulsante e non lo rilascia, allora il numero nel TextView deve essere aumentato e questo dovrebbe ripeti fino a quando l'utente non rilascia lo Button. In altre parole: come aumentare il numero più e più volte finché l'utente tiene premuto il pulsante?Ripetere un'azione tenendo premuto il pulsante lungo

risposta

6

Un approccio generale (non specifico per Android) sarebbe quello di rilevare la stampa e rilasciare l'evento separatamente. L'evento stampa avvia un'attività periodica (Runnable o Thread) che si aggiunge al contatore (diciamo 5 volte al secondo o una volta ogni 200 ms). L'evento di rilascio interrompe l'attività periodica.

1
  1. Impostare una View.OnLongClickListener per il pulsante
  2. Lascia la tua attività un Runnable, e inizializzare (ma non avviarlo) quando si carica l'attività
  3. Avere l'OnLongClickListener fare il suo normale compito asincrona di aggiornamento la casella di testo e il controllo dell'ora da quando è stato premuto per la prima volta
  4. Creare uno OnTouchListener che interrompe lo Runnable quando l'evento di tocco viene completato.

So che è un progetto di massima, ma questo è un modello molto utile per essere in grado di riutilizzare e modificare, quindi vale la pena affondare i tuoi artigli in esso ...

+0

+1 Questo suona come il processo specifico di Android che stavo descrivendo in modo più generico. –

2

Avrai bisogno di fissare un evento di ripetizione asincrona quando si riceve un evento mousePressed e lo si interrompe quando si riceve un evento mouseReleased.

Ci sono molti modi per gestirlo in Java. Mi piace usare le classi java.util.concurrent, che sono abbastanza flessibili. Ci sono alcune cose da tenere a mente:

Se i tuoi eventi asincroni non si verificano sul thread di invio eventi, devi impostare il testo 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); 
    } 
} 
Problemi correlati