In JavaFX 1.3 the evaluation of the KeyValues in the Timeline changed. Now, the KeyValues are evaluated once before the Timeline starts (see "Animation: Changed semantics of
KeyValue
evaluation"
in Java FX 1.3 Migration Guide) and thus my Duke Anim doesn’t work in Java FX 1.3 :(.To correct it, the function Timeline.evaluateKeyValues() has been added. This function has to be used for re-evaluates all the keyValues when it is called.
Now, let us correct Duke Anim :)
To correct Duke Anim, I have made only 2 changes:
· I call the function Timeline.evaluateKeyValues() at the end of the action function of KeyFrame at 1s.
anim.evaluateKeyValues();
anim.evaluateKeyValues();
· And I declare the variable anim with his type to be able to call the function Timeline.evaluateKeyValues() in the action function of the KeyFrame.
public var anim:Timeline = Timeline { …
public var anim:Timeline = Timeline { …
This Duke Anim's version works on : Windows (Seven), Linux (Ubuntu 9.10) and Mac OS X (10.6.3) with the Default toolkit and the Prism toolkit (JVM argument: -Xtoolkit prism)
Main.fx |
package dukeanim; import java.util.Random; import javafx.animation.Interpolator; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.Scene; import javafx.scene.transform.Translate; import javafx.runtime.ConditionalFeature; import javafx.runtime.Platform; import javafx.stage.Stage; class DukeAnimModel { public var imageURL = "{__DIR__}images/duke.png"; public var x = 0; public var y = 0; var xTarget = 0; var yTarget = 0; var xTemp = 0; var yTemp = 0; public var anim:Timeline = Timeline { autoReverse: false keyFrames: [ KeyFrame { time: 0s values: [x => xTemp, y => yTemp] }, KeyFrame { time: 1s values: [x => xTarget tween Interpolator.SPLINE(0,.5,.5,1),y => yTarget tween Interpolator.SPLINE(0,.5,.5,1)] action: function(): Void{ var generator = new Random(); xTarget = (generator.nextFloat() * 240 + 1) as Integer; yTarget = (generator.nextFloat() * 320 + 1) as Integer; xTemp=x; yTemp=y; anim.evaluateKeyValues(); } }, ] repeatCount: Timeline.INDEFINITE }; } println("Effect enabled: {Platform.isSupported(ConditionalFeature.EFFECT)}"); println("Input Method enabled: {Platform.isSupported(ConditionalFeature.INPUT_METHOD)}"); println("Scene 3D enabled: {Platform.isSupported(ConditionalFeature.SCENE3D)}"); println("Shape Clip enabled: {Platform.isSupported(ConditionalFeature.SHAPE_CLIP)}"); var dukeAnimModel = DukeAnimModel {} dukeAnimModel.anim.play(); Stage { title: "Application title" width: 240 height: 320 scene: Scene { content: ImageView { transforms: Translate { x: bind dukeAnimModel.x y: bind dukeAnimModel.y } image: Image { url: dukeAnimModel.imageURL } } } onClose: function(){ println("exit"); } }