2012-04-03 21 views
5

Załóżmy, że masz TextView, który wyświetla liczbę jak 0 i masz Button. Teraz, jeśli użytkownik naciśnie przycisk, liczba w TextView zwiększy się o jeden (wiem, jak to zrobić), ale jeśli użytkownik naciśnie przycisk i nie zwalnia go, należy zwiększyć liczbę w numerze TextView. powtórz to samo, o ile użytkownik nie zwolni Button. Innymi słowy: Jak zwiększać liczbę w kółko, dopóki użytkownik przytrzyma przycisk?Powtórz czynność po naciśnięciu długiego przycisku.

Odpowiedz

6

Ogólnym podejściem (nie specyficznym dla systemu Android) byłoby wykrycie zdarzenia typu "naciśnij i zwolnij" osobno. Wydarzenie prasowe rozpoczyna okresowe zadanie (Runnable lub Thread), które dodaje się do licznika (powiedzmy 5 razy na sekundę lub raz na 200 ms). Zdarzenie wydania zatrzymuje zadanie okresowe.

1
  1. Skonfiguruj View.OnLongClickListener dla przycisku
  2. Daj swoją aktywność Runnable i zainicjować (ale nie go uruchomić) po załadowaniu aktywność
  3. mają OnLongClickListener wykonywać swoje zadanie regularnego aktualizowania asynchronicznej pole tekstowe i sprawdzanie czasu od jego pierwszego kliknięcia
  4. Utwórz OnTouchListener, który zatrzymuje Runnable, gdy zdarzenie dotykowe zostanie ponownie zmienione.

wiem, że to brulion, ale to jest naprawdę przydatny wzór, aby móc ponownie użyć i modyfikować, więc warto zatapiając swoje szpony w nim ...

+0

+1 To brzmi jak proces specyficzny dla Androida, który opisałem bardziej ogólnie. –

2

Musisz zaplanować asynchroniczne powtarzanie zdarzenia po otrzymaniu zdarzenia mousePressed i zatrzymanie go po otrzymaniu zdarzenia mouseReleased.

Istnieje wiele sposobów radzenia sobie z tym w Javie. Lubię korzystać z klas java.util.concurrent, które są dość elastyczne. Należy jednak pamiętać o kilku rzeczach:

Jeśli twoje asynchroniczne zdarzenia nie występują w wątku wywołania zdarzenia, musisz ustawić tekst JButton używając 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); 
    } 
} 
Powiązane problemy