Анимация может быть связана со свойствами графических объектов и элементов управления, например размером, местоположение, цвет и т. п, Объект Timeline предоставляет возможность обновлять значения свойств с течением времени. JavaFX поддерживает анимацию ключевых кадров. Для этого переходы состояний графической сцены объявляются начальным и конечным моментальными снимками (KeyFrame ) состояния сцены в определенные моменты времени. Система может автоматически выполнять анимацию. Он может остановить, приостановить, возобновить, повернуть назад или повторить движение по запросу.
Для создания анимации необходимо:
установить временную шкалу Timeline timeline = new Timeline();
добавить обработчик EventHandler<ActionEvent> к Timelines через его включение в объект javafx.animation.KeyFrame класса.
в конструктор KeyFrame вставить javafx.util.Duration объект, который определяет время KeyFrame, и EventHandler<ActionEvent> object, с реализацией метода handle(ActionEvent e) который исполняется, когда заданное время кадра истечет, например KeyFrame frame1 = new KeyFrame(Duration.seconds(1), new MyHandler());
В Timeline можно включать множество KeyFrames с различными длительностями и обработчиками:
например, timeline.getKeyFrames().addAll(frame1, frame2);
Для бесконечного повторения - Timeline.INDEFINITE
Для запуска анимации вызовите timeline.play();
Для повторного запуска с начала цикла: timeline.playFromStart();
Для остановки: timeline.stop();
Пример 1. Движение шарика
// Константы
private static final int CANVAS_WIDTH = 640;
private static final int CANVAS_HEIGHT = 480;
private static final int UPDATE_PERIOD = 50; // milliseconds
// Фигура и ее параметры
private Circle ball;
private int centerX = 280, centerY = 220; // Center (x, y)
private int radius = 190;
private int xStep = 3, yStep = 5; // displacement per step in x, y
// Установка мяча
ball = new Circle(centerX, centerY, radius, Color.LIGHTSKYBLUE);
canvas.getChildren().addAll(ball);
// Установка временной шкалы и настройка кадров
Timeline loop = new Timeline(new KeyFrame(Duration.millis(UPDATE_PERIOD), evt -> {
// обновление координат (x, y)
centerX += xStep;
centerY += yStep;
if (centerX + radius > CANVAS_WIDTH || centerX - radius < 0) {
xStep = -xStep;
}
if (centerY + radius > CANVAS_HEIGHT || centerY - radius < 0) {
yStep = -yStep;
}
ball.setCenterX(centerX);
ball.setCenterY(centerY);
}));
// Запуск бесконечного числа циклов
loop.setCycleCount(Timeline.INDEFINITE);
loop.play();
}
Пример 2. Обрабочик события временной шкалы Timeline для смены изображений в ImageView
private class ShowHandler implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent t) {
if( iter_main.hasNext()) {
Image name = (Image) iter_main.next();
imageView.setImage(name);
}
}
}
При начальной установке временной шкалы
timeline.getKeyFrames().add(new KeyFrame(new Duration(1000),new EvHandler()));