Анимационный переход для параллельного последовательного перехода в javafx

#java #animation #javafx

#java #Анимация #javafx

Вопрос:

У меня есть программа, которая запускает несколько анимаций одну за другой, и я хотел добавить опцию перехода к концу некоторой анимации, поэтому я использовал что-то вроде этого

 Animation anim = ... ;
anim.setCurrentTime(anim.getTotalDuration());
anim.play();
  

В большинстве случаев это работает, но бывают случаи, особенно когда задействованы параллельные и последовательные переходы, когда это не работает. Например, вот код для последовательного исчезновения некоторых кругов и прямоугольников:

 public void start(Stage stage) {
        Pane root = new Pane();
        Scene scene = new Scene(root, 500, 500);
        stage.setScene(scene);
        stage.show();        

        int N = 10;
        Circle cir[] = new Circle[N];
        Rectangle rect[] = new Rectangle[N];
        for (int i = 0; i < N; i  ) {
            cir[i] = new Circle(10);
            cir[i].relocate(100   i * 30, 100);
            cir[i].setOpacity(0);
            rect[i] = new Rectangle(20, 20);
            rect[i].relocate(100   i * 30, 150);
            rect[i].setOpacity(0);

        }
        Button btn = new Button("CLICK");
        root.getChildren().addAll(cir);
        root.getChildren().addAll(rect);
        root.getChildren().addAll(btn);

        btn.setOnAction(evt -> {
            SequentialTransition st1 = new SequentialTransition();
            ObservableList<Animation> kids = st1.getChildren();
            for (int i = 0; i < N; i  ) {
                FadeTransition fade1 = new FadeTransition(Duration.millis(200), cir[i]);
                fade1.setFromValue(0);
                fade1.setToValue(1);
                kids.add(fade1);
            }
            SequentialTransition st2 = new SequentialTransition();
            kids = st2.getChildren();
            for (int i = 0; i < N; i  ) {
                FadeTransition fade2 = new FadeTransition(Duration.millis(200), rect[i]);
                fade2.setFromValue(0);
                fade2.setToValue(1);
                kids.add(fade2);
            }
            Animation anim = new ParallelTransition(st1, st2);
            anim.jumpTo(anim.getTotalDuration());
            anim.play();
        });

    } 
  

Если вы запустите его так, как сейчас, ничего не произойдет. Однако, если вы просто перейдете к концу st1 или st2, это сработает. Кроме того, если вместо перехода к концу анимации вы переходите на одну миллисекунду раньше

 anim.jumpTo(anim.getTotalDuration().subtract(Duration.ONE));
  

это действительно работает.
К сожалению, это только потому, что оба st1 и st2 заканчиваются одновременно. Если, например, вы измените fade2 на длительность 100 вместо 200, вы увидите только появляющиеся круги. Это верно всякий раз, когда вы переходите к длительности после завершения st2 (1000 миллис).

Есть ли способ перейти к какой-либо части анимации без подобных проблем? Единственное решение, которое я могу придумать, — это изменить скорость на какое-то очень большое число, а затем просто запустить анимацию, чтобы она обновлялась на экране, но даже это сработает только тогда, когда я хочу перейти до конца анимации.