我想在Timeline运行时修改它,例如响应鼠标单击我想要更改动画的目标值。我已经尝试了几种方法来实现这一点,包括(在鼠标单击处理程序中):
pause()
上的Timeline
暂停动画,清除KeyFrames
ObservableList
,添加新的KeyFrame
并致电play()
Timeline
。jumpTo(cueName)
上调用Timeline
。一些示例代码是:
String cueName = String.valueOf(System.currentTimeMillis());
KeyValue kv = new KeyValue(myObject.rotateProperty(), -90 + 180.0 * Math.random(), new CustomInterpolator());
KeyFrame kf = new KeyFrame(Duration.seconds(10), cueName, kv);
startupTimeline.getKeyFrames().add(kf);
startupTimeline.jumpTo(cueName);
startupTimeline.play();
这些似乎都不起作用,动画就停止了。
我是否可以修改现有时间轴的KeyFrame列表,或者如果我想在动画执行时更改动画,是否需要创建新的时间轴?
答案 0 :(得分:3)
据我所知,Timeline
一旦开始播放就无法以这种方式改变。问题是你可能会改变总循环持续时间,这会混淆所有插值计算。
你可能需要一个AnimationTimer
。 AnimationTimer
有一个抽象的handle(long timestamp)
方法,它采用时间戳(以纳秒为单位),并在每次渲染场景图时调用。所以你可以这样做:
AnimationTimer animation = new AnimationTimer() {
private long startTime = -1;
@Override
public void handle(long timestamp) {
if (startTime == -1) {
startTime = timestamp ;
}
long totalElapsedNanoseconds = timestamp - startTime ;
// update UI based on elapsed time...
}
}
在JavaFX应用程序线程上调用handle()
方法,因此更新UI并引用仅在同一线程上更改的任何变量是安全的。