Javafx 2 JavaFX2.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
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();