Как выполнить последовательно эти два метода? получается что они выполняются одновременно, а нужно чтобы сначала прямоугольник перемещался по оси У а потом по Х
public void onClick() throws InterruptedException {
takeFrom();
otvodRoll();
}
/**
* Едем по отводящему рольгангу: шаг 2
*/
public void otvodRoll(){
// Конечная позиция:
double stopPositionX = 24;
KeyFrame keyFrame = new KeyFrame(
// Считаем, сколько времени будет длиться анимация:
Duration.millis((tube.getLayoutX() - stopPositionX) / 2 * 50),
event -> {
logArea.setText(logArea.getText() + "\nПеремещение трубы по отводящему рольгангу окончено");
},
// Указываем, какое свойство анимировать, его конечное значение и алгоритм:
new KeyValue(tube.layoutXProperty(), stopPositionX, Interpolator.LINEAR)
);
// Создаем и запускаем одноразовый таймер для анимации по ключевому кадру:
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(keyFrame);
timeline.setCycleCount(1);
timeline.delayProperty();
timeline.play();
}
/**
* С поперечного транспортера получаем трубу: шаг 1
* @throws InterruptedException
*/
public void takeFrom() throws InterruptedException {
// Конечная позиция:
double stopPositionY = 78;
KeyFrame keyFrame = new KeyFrame(
// Считаем, сколько времени будет длиться анимация:
Duration.seconds((Math.abs(tube.getLayoutY() - stopPositionY) ) / 13.3),
event -> {
logArea.setText("Положили трубу с поперечного транспортера");
},
// Указываем, какое свойство анимировать, его конечное значение и алгоритм:
new KeyValue(tube.layoutYProperty(), stopPositionY, Interpolator.LINEAR)
);
// Создаем и запускаем одноразовый таймер для анимации по ключевому кадру:
Timeline timeline = new Timeline();
timeline.getKeyFrames().add(keyFrame);
timeline.setCycleCount(1);
timeline.play();
}
UPD1
На завершение анимации можно установить обработчик. Поэтому достаточно из метода возвращать Timeline и устанавливать этот обработчик в вызывающем методе
public Timeline takeFrom() throws InterruptedException {
...
return timeline;
}
public void onClick() throws InterruptedException {
takeFrom().setOnFinished(event -> otvodRoll());
}
или принимать обработчик в качестве аргумента и передавать его из вызывающего метода
public void takeFrom(EventHandler<ActionEvent> handler) throws InterruptedException {
...
timeline.setOnFinished(handler);
timeline.play();
}
public void onClick() throws InterruptedException {
takeFrom(event -> otvodRoll());
}
Лучше даже сделать так, чтобы оба метода могли возвращать Animation и реализовывали сигнатуру EventHandler.handle(), чтобы их можно было объединять в произвольные цепочки.
Если сделать так, чтобы методы возвращали Timeline:
public Timeline takeFrom() {
KeyFrame keyFrame = new KeyFrame(...);
return new Timeline(keyFrame);
}
public Timeline otvodRoll() {
KeyFrame keyFrame = new KeyFrame(...);
return new Timeline(keyFrame);
}
Тогда можно использовать SequentialTransition:
SequentialTransition sequence = new SequentialTransition(
takeFrom(),
otvodRoll()
);
sequence.play();
Еще для такого случая, когда нужны только простые передвижения, можно воспользоваться PathTransition. Для этого нужно создать путь Path от центра прямоугольника до нужных точек и указать этот путь и узел (прямоугольник) в параметрах PathTransition. При этом время можно не высчитывать, а задать скорость через метод setRate(). Единственное замечание — нужно понимать, что если в исходных примерах анимировалась позиция прямоугольника на панели (layoutXProperty и layoutYProperty), то PathTransition анимирует X и Y в матрице преобразования координат (translateXProperty и translateYProperty):
public void pathAnimation(ActionEvent event) {
double stopPositionX = 100;
double stopPositionY = 216;
double xOffset = tube.getWidth() / 2;
double yOffset = tube.getHeight() / 2;
Path path = new Path();
path.getElements().addAll(
new MoveTo(xOffset, yOffset),
new VLineTo(stopPositionY - tube.getLayoutY()),
new HLineTo(stopPositionX - tube.getLayoutX()));
PathTransition pathTransition = new PathTransition();
pathTransition.setNode(tube);
pathTransition.setPath(path);
// pathTransition.setDuration(Duration.millis(2000));
pathTransition.setRate(0.17);
pathTransition.setOnFinished(event1 -> {
System.out.println("Движение закончено");
});
pathTransition.play();
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей