2017-02-12 30 views
0

我想在運行時修改Timeline,例如響應鼠標點擊我想更改動畫的目標值。通過在Timeline調用pause(),清除KeyFramesObservableList,添加新KeyFrame並呼籲Timelineplay()在動畫執行時向時間軸中添加一個新的KeyFrame

  1. 暫停動畫:我曾嘗試幾種方法來做到這一點,包括(在鼠標單擊處理程序)。
  2. 使用Cue-name創建一個新的KeyFrame,將新幀添加到Observable列表並在Timeline上調用jumpTo(cueName)

一些示例代碼:

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

好的建議,James_D。我不知道這樣的階級是存在的。實際上,我試圖'彎曲''時間軸',使得由我的自定義插值器計算的位置與傳遞給它的小數值無關。嘗試做某件事情並不是件好事,AnimationTimer可能更適合。請把你的評論作爲答案,我會標記爲正確的。 – Kerry

回答

2

據我所知,一旦Timeline開始播放,就不能以這種方式改變。問題是你可能會改變總循環持續時間,這會混淆所有的插值計算。

爲此,您可能需要一個AnimationTimerAnimationTimer有一個抽象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... 
    } 
} 

handle()方法被調用在JavaFX應用程序線程,因此它是安全更新UI,並引用只能在同一個線程改變的變量。

+0

這正是我想要達到的目標。 – Kerry