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
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.
- Skonfiguruj
View.OnLongClickListener
dla przycisku - Daj swoją aktywność
Runnable
i zainicjować (ale nie go uruchomić) po załadowaniu aktywność - mają OnLongClickListener wykonywać swoje zadanie regularnego aktualizowania asynchronicznej pole tekstowe i sprawdzanie czasu od jego pierwszego kliknięcia
- Utwórz
OnTouchListener
, który zatrzymujeRunnable
, 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 ...
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);
}
}
+1 To brzmi jak proces specyficzny dla Androida, który opisałem bardziej ogólnie. –