如何在javafx时间轴中不断更改keyvalue的目标值?

时间:2016-09-18 10:27:05

标签: java animation javafx bind

在动画运行时,有任何方法可以不断更改键值的目标值,而不是将固定值作为目标。

为了实现这个目标,我已经将目标值与节点的宽度属性绑定,该属性会不断变化。但是当动画启动时,绑定根本不起作用,目标值不会更新并卡住。 / p>

这是动画的代码

public void setGlowAnimation(){
    System.out.println("WIDTH "+width.getValue());
    KeyValue value = new KeyValue(glowshape.centerXProperty(),width.getValue(),Interpolator.EASE_OUT);

    KeyFrame keyframe1 = new KeyFrame(Duration.millis(2000),value);

    glow_timeline = new Timeline();
    glow_timeline.setCycleCount(Timeline.INDEFINITE);
    glow_timeline.setAutoReverse(true);
    glow_timeline.getKeyFrames().add(keyframe1);
}



public void init(){
    indetermination();
    setStartAnimation();
    createEllipse();

    width = new SimpleDoubleProperty();
   width.bind(this.widthProperty());
   setGlowAnimation();
}

1 个答案:

答案 0 :(得分:0)

我不认为你可以修改Timeline这样的活动。请考虑使用Transition代替:

import javafx.animation.Animation;
import javafx.animation.Interpolator;
import javafx.animation.Transition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class AdaptiveAnimation extends Application {

    @Override
    public void start(Stage primaryStage) {
        Circle circle = new Circle(0, 100, 25, Color.CORNFLOWERBLUE);
        Pane pane = new Pane(circle);

        Interpolator interp = Interpolator.EASE_BOTH ;

        Transition transition = new Transition() {
            {
                setCycleDuration(Duration.millis(2000));
            }

            @Override
            protected void interpolate(double frac) {
                double x = interp.interpolate(0, pane.getWidth(), frac);
                circle.setCenterX(x);
            }

        };
        transition.setCycleCount(Animation.INDEFINITE);
        transition.setAutoReverse(true);

        Scene scene = new Scene(pane, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
        transition.play();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

当您调整窗口大小时,这有点跳跃,但它提供了基本的想法。