Изначально я не смог воспроизвести его, но после нескольких попыток мне удалось воспроизвести его.Похоже, это связано с задержкой.
Насколько я знаю (я не специалист по анимации), анимации (включая PathTransition
) используют таймер внутри, и каждый тик обычно эквивалентенДлительность импульса графа сцены JavaFX.Это означает, что анимация обновляется максимум 60 раз в секундуКогда происходит импульс, PathTransition
вычисляет новые значения перевода на основе прошедшего времени на таймере.Итак, что здесь происходит, так это то, что вычисленные значения перевода довольно далеко друг от друга между двумя конкретными импульсами.В общем, чем больше вещей вы пытаетесь сделать в потоке приложений JavaFX, тем больше вероятность того, что это произойдет.
Если вы пытаетесь нарисовать линию трассировки на основе анимации, вы не сможете избежать этого.это время ожидания.Тем не менее, вы можете избежать проблемы прорисовки контуров, разбив их на несколько анимаций.Каждая анимация будет двигаться по прямой линии, и каждая из ваших линий трассировки гарантированно будет начинаться с начала и до конца в конечной точке.
Я пробовал это, и это работает:
// Heuristic Change
// Path path = new Path();
// path.setStroke(Color.RED);
// path.getElements().add(new MoveTo(num.get(0).getCenterX(), num.get(0).getCenterY()));
// path.setStrokeWidth(1);
// for (int i = 0; i < num.size(); i++) {
// try {
// path.getElements().addAll(new LineTo(num.get(i).getCenterX(), num.get(i).getCenterY()));
// }
// catch (IndexOutOfBoundsException e) {
// path.getElements().addAll(new LineTo(num.get(0).getCenterX(), num.get(0).getCenterY()));
// }
// }
List<Path> paths = new ArrayList<>();
for (int i = 0; i < num.size() - 1; i++) {
Circle current = num.get(i);
Circle next = num.get(i + 1);
Path path = new Path();
path.setStroke(Color.RED);
path.getElements().addAll(new MoveTo(current.getCenterX(), current.getCenterY()),
new LineTo(next.getCenterX(), next.getCenterY()));
path.setStrokeWidth(1);
paths.add(path);
}
// root.getChildren().addAll(path);
root.getChildren().addAll(paths);
Circle pen = new Circle();
// create animation
// animation = createPathAnimation(path, Duration.seconds(num.size()/4));
animation = createPathAnimation(paths, Duration.millis(200), pen);
И ...
private Animation createPathAnimation(List<Path> paths, Duration duration, Circle pen) {
SequentialTransition seq = new SequentialTransition();
// ...
for (Path path : paths) {
// The same PathTransition stuff you had
seq.getChildren().add(pathTransition);
}
return seq;
}
Единственное, что изменилось, это то, что скорость изменяется на каждом отрезке полного пути.Если вы хотите сохранить эту константу, вы должны применить теорему Пифагора, чтобы найти расстояние, и соответствующим образом скорректировать продолжительность.