Я использую таймерный цикл для реализации анимации на своем Java-приложении. На данный момент я использую статические переменные, относящиеся к анимации (время начала, откуда начинается элемент и где он собирается). Есть ли более простой способ сделать это? Могу ли я отправлять эти переменные в качестве аргументов, когда я запускаю таймер?Как лучше реализовать анимацию с помощью swing Timer в Java
...
import javax.swing.Timer;
public class SlidePuzz2 extends Applet implements MouseMotionListener, MouseListener {
...
static Element animating;
static PieceLoc blank;
static int delta;
static int orig_x;
static int orig_y;
static long timeStart;
Timer aniTimer;
...
public void init() {
...
aniTimer = new Timer(20, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
int dx = (blank.x*piece-orig_x);
int dy = (blank.y*piece-orig_y);
int t = 200;
delta = (int)(System.currentTimeMillis()-timeStart);
if (delta>t) delta=t;
animating.x = orig_x + dx*delta/t;
animating.y = orig_y + dy*delta/t;
repaint();
if (delta==t) {
animating.updateCA();
board.checkCompleted();
aniTimer.stop();
}
}
});
...
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
blank = board.getBlankPl();
animating = e;
timeStart = System.currentTimeMillis();
orig_x = animating.x;
orig_y = animating.y;
aniTimer.start();
...
Я считаю, что использование javax.swing.Timer - лучший способ реализовать анимацию. – mre
@mre да, это то, что я делаю уже. мой вопрос в том, как я могу использовать таймер качания лучше, чем более элегантно, например, избегая статических переменных вне цикла анимации для его настройки. –
Вам не нужно использовать анонимный ActionListener. Создайте новый класс, который реализует ActionListener и настроит его со всеми связанными/необходимыми данными. – tenorsax