2017-02-12 11 views
0

Timelineを実行中に変更したいと思います。たとえば、マウスのクリックに応答して、アニメーションの目標値を変更したいとします。アニメーションの実行中にタイムラインに新しいKeyFrameを追加

新しい KeyFrameを追加し、 Timelineplay()を呼び出し、 KeyFrames ObservableListをクリアし、 Timelinepause()を呼び出すことによって、アニメーションを一時停止
  1. :私は(マウスでハンドラをクリック)を含め、これを行うために、いくつかの方法を試してみました。
  2. Cue-nameで新しいKeyFrameを作成し、Observableリストに新しいフレームを追加し、TimelinejumpTo(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私はそのようなクラスが存在することを知らなかった。実際に私のカスタム補間器で計算された位置が、そこに渡される分数値とは無関係になるように、「タイムライン」を曲げようとしています。アニメーションタイマーが意図していなかったことを何かにしようとするのは決して良いことではありません。あなたのコメントを回答として記入してください。私は正しいものとしてマークします。 – Kerry

答えて

2

私が知る限り、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... 
    } 
} 

handle()方法は、JavaFXのアプリケーションスレッドで呼び出され、UIを更新するために、唯一の同じスレッド上で変更されているすべての変数を参照しても安全です。

+0

これは、私が達成したいことに使用するのに適したクラスです。 – Kerry

関連する問題