JavaFX平滑动画

时间:2014-03-20 14:01:49

标签: java javafx javafx-2 javafx-8

所以我有这个Timeline自定义动画。节点转换无关紧要。

final KeyValue kv1 = new KeyValue(angle, HALF_PI,  Interpolator.LINEAR);
final KeyValue kv2 = new KeyValue(angle, -HALF_PI, Interpolator.EASE_BOTH);

final KeyFrame kf1 = new KeyFrame(Duration.millis(0),   kv1);
final KeyFrame kf2 = new KeyFrame(Duration.millis(500), kv2);

Timeline animation = new Timeline(kf1, kf2);

animation.setRate(1);

我的angle变量在此时间轴中被修改,并用于转换节点。如您所见,在这种情况下,rate 1 ,而duration 500

为了平滑变换,我猜测角度应该经过几个离散值,这些值由Interpolator设置。

另外,我不打算使用Task来实现这一目标。只有当lagginess严重低于使用Timeline

问题:

哪种调整可以使动画变得平滑?

A。rate +高duration
B。rate +低duration
C。 ???其他

1 个答案:

答案 0 :(得分:3)

费率不是帧费率。这些设置都不会影响动画的平滑度。使用任务无济于事:动画API只是一种高级机制,用于在每个帧渲染上更新UI的属性,以一种相对于时间插值的方式。如果你把工作放在一个Task中,你就必须更新FX Application Thread上的属性,所以你只是复制动画API为你提供的代码。

在幕后,JavaFX有一个线程,可以将帧渲染到图形系统。目标帧速率(当前)为60fps。在每个帧渲染时,渲染线程必须与JavaFX Application线程同步,因此如果你在该线程上做了太多工作,帧速率将低于60fps。

我认为动画的工作方式如下:在每个帧渲染时,任何正在运行的动画都将通过沿关键帧之间的时间线插值来更新其关联属性。基本算法非常明显:查看当前时间,减去开始时间,除以结束时间和开始时间之间的差值,使用该值更新属性。

所有速率确实充当插值器的乘数。因此,如果设置rate = -1,则动画会向后运行。如果设置rate = 2,则以指定持续时间的一半完成。如果你设置rate = -0.5,它会在指定的持续时间内完成两次,然后向后运行,等等。帧速率仍然是基础FX实现可以从系统中挤出的任何数据,最大值(当前执行)60 fps。

平滑度基本上受帧速率的影响(同样,你唯一的控制就是确保你没有过多地使用FX应用程序线程),以及你每帧的运动量。非常快的动画将涉及每帧移动相当长的距离,并且看起来不像每帧移动几乎不可感知的距离的东西。