В качестве альтернативы SequentialTransition вы можете использовать метод setOnFinished класса PathTransition.Этот метод вызывается после завершения анимации.Здесь вы можете установить новый путь и запустить анимацию снова.
Используя метод setOnFinished, метод MoveCircles становится:
public void MoveCircles(BorderPane borderPane,Circle circles[]){
for (int i = 0; i < 20; i++) {
PathTransition pathTransition2 = new PathTransition();
pathTransition2.setNode(circles[i]);
pathTransition2.setDuration(Duration.seconds(2));
pathTransition2.setPath(createPath(borderPane, pathTransition2));
pathTransition2.play();
pathTransition2.setInterpolator(Interpolator.LINEAR);
pathTransition2.setOnFinished(e -> {
pathTransition2.setPath(createPath(borderPane, pathTransition2));
pathTransition2.play();
});
}
}
Поскольку создание пути используется дважды, имеет смысл перенести функциональность в отдельный метод, например,
private Line createPath(BorderPane borderPane, PathTransition pathTransition) {
Circle circle = (Circle)pathTransition.getNode();
Line line = (Line)pathTransition.getPath();
Random random = new Random();
int endPosX = random.nextInt((int) borderPane.getWidth() - 30);
int endPosY = random.nextInt((int) borderPane.getHeight() - 30);
return new Line(line == null ? circle.getCenterX() : line.getEndX(), line == null ? circle.getCenterY() : line.getEndY(), endPosX, endPosY); // without discontinuities
// return new Line(circle.getCenterX(), circle.getCenterY(), endPosX, endPosY); // with discontinuities
}
Поскольку вторым параметром метода createPath является сам pathTransition, можно легко использовать конечную точку предыдущего пути в качестве начальной точки следующего пути, что позволяет избежать разрывов в последовательных последовательностях движения.Но это, конечно, необязательно.