我有一个程序可以一个接一个地运行几个动画,我想添加一个选项以跳到某些动画的结尾,所以我使用了类似的方法
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都同时结束。例如,如果将衰落2的持续时间改为100,而不是200,则只会看到圆圈出现。每当您跳到st2完成后的持续时间(1000毫秒)时,都是如此。
总有没有跳到动画的某些部分而没有这些问题吗?我能想到的唯一解决方法是将速率更改为一个非常大的数字,然后运行动画以使其在屏幕上进行更新,但是即使这仅适用于我想一直跳到最后的情况。动画。