Javafx 2 JavaFX2.2中的顺序时间轴动画

Javafx 2 JavaFX2.2中的顺序时间轴动画,javafx-2,Javafx 2,我目前正在javafx2.2中试用Timeline类。说明时间线 按KeyFrame.time指定的顺序顺序顺序处理各个关键帧 因此,我认为我可以通过将一些关键帧对象按特定顺序放入时间线,创建一个类似于的顺序转换的动画。每个关键帧都有自己的持续时间。这就是我的问题开始的地方:什么是持续时间?关键帧应开始的偏移量,或关键帧设置动画所需的“真实”持续时间?我认为API在这一点上不是很清楚 请查看以下代码: Group g = new Group(); Circle c = new C

我目前正在javafx2.2中试用
Timeline
类。说明
时间线

按KeyFrame.time指定的顺序顺序顺序处理各个关键帧

因此,我认为我可以通过将一些关键帧对象按特定顺序放入时间线,创建一个类似于的顺序转换的动画。每个
关键帧
都有自己的
持续时间
。这就是我的问题开始的地方:什么是持续时间?
关键帧
应开始的偏移量,或
关键帧
设置动画所需的“真实”持续时间?我认为API在这一点上不是很清楚

请查看以下代码:

    Group g = new Group();
    Circle c = new Circle(15);
    c.setTranslateX(150);
    c.setTranslateY(150);
    g.getChildren().add(c);

    Timeline tl = new Timeline();
    KeyValue kv1 = new KeyValue(c.scaleXProperty(), 5);
    KeyValue kv2 = new KeyValue(c.scaleYProperty(), 5);
    KeyFrame kf1 = new KeyFrame(Duration.millis(1500), kv1,kv2);

    KeyValue kv3 = new KeyValue(c.centerXProperty(), 200);
    KeyFrame kf2 = new KeyFrame(Duration.millis(5000), kv3);
    tl.getKeyFrames().addAll(kf1,kf2);

    tl.play();

    primaryStage.setScene(new Scene(g,500,500));
    primaryStage.show();
我的目标是先显示关键帧kf1的“生长”动画,然后是kf2的“移动”动画。代码同时启动每个
关键帧的动画(t=0s),但长度不同(因为
持续时间设置不同)


那么,有没有办法改变这种行为,使
关键帧
按顺序“播放”?

关键帧
表示动画中的瞬间(“帧”)。
time
参数表示的不是持续时间,而是该帧出现时时间线上的瞬间;您可以将其视为时间线开始后的持续时间。时间轴从时间零点延伸到其所有关键帧值的最大时间,并在这些帧之间对其所有关键帧中定义的特性值进行插值

因此,您的代码创建了一个长度为5秒的时间线。它插值centerX以在这5秒内从0移动到200,并在前1.5秒内将scaleX和scaleY属性从1增加到5

要定义要查找的顺序行为,请使用:


如果您愿意,您可以用a和a替换这两条时间线。

我想您也可以纯粹通过一次
转换来实现这一点。使用
scaleX=5
scaleY=5
centerX=0
在1500毫秒时定义
关键帧,然后使用
scaleX=5
scaleY=5
centerX=200>在5000毫秒时定义
关键帧。我认为
SequentialTransition
让事情变得更清楚了。谢谢,我不知道我可以将
SequentialTransition
时间线一起使用。在您的另一个解决方案中,仍然让我恼火的部分是,我必须使用
关键帧
中在
时间线
中使用的所有属性来生成连续动画。当我在第一个
关键帧中省略
centerX
属性时,时间轴开始同时“播放”所有
关键帧。你知道为什么会这样吗?这对我来说很直观。我对传统(即非计算机生成的)动画知之甚少,但我认为这个术语就是基于此。动画由一系列帧组成。在时间轴中,不定义所有帧,只对某些关键帧和其余帧进行插值。默认情况下,时间线中出现的任何属性都是内插的:在我看来,没有任何其他明显的方法可以做到这一点。请注意,您可以在同一时间点有多个
关键帧
s,因此您仍然可以在单个
时间线
中将“移动”和“增长”分解为单独的
关键帧
s。尽管如此,
SequentialTransition
(由任何
动画
对象组成)仍然是实现这一点的方法。
KeyValue kv1 = new KeyValue(c.scaleXProperty(), 5);
KeyValue kv2 = new KeyValue(c.scaleYProperty(), 5);
KeyFrame kf1 = new KeyFrame(Duration.millis(1500), kv1,kv2);
Timeline grow = new Timeline();
grow.getKeyFrames().add(kf1);

KeyValue kv3 = new KeyValue(c.centerXProperty(), 200);
KeyFrame kf2 = new KeyFrame(Duration.millis(5000), kv3);
Timeline move = new Timeline();
move.getKeyFrames().add(kf2);

SequentialTransition sequence = new SequentialTransition(grow, move);
sequence.play();