JavaFX:Window/Stage 变化期间的动画

JavaFX: Animation during Window/Stage change

如何在舞台变换时制作动画?

-例如,我有 2 个不同尺寸(宽度和高度)的阶段。通常,没有任何动画,第二个屏幕会立即弹出。我希望第二阶段能够顺利显示(比如在 Mac OS Sierra 中打开或关闭 window)。我能找到的所有教程主要是关于场景变化中的动画。可能是我搜索的方式不对

这是我改变阶段的方式。

  FXMLLoader loader = new FXMLLoader(getClass().getResource(Insert FXML here));
    Parent root = loader.load();
    Stage stage = new Stage();
    stage.setResizable(false);
    stage.initStyle(StageStyle.UNDECORATED);
    stage.setScene(new Scene(root));
    stage.show();

非常感谢任何与我正在寻找的内容相关的帖子。

试试 AnimationTimer。 时间轴将不起作用,因为舞台的属性是只读的。


FXMLLoader loader = new FXMLLoader(getClass().getResource(Insert FXML here));
Parent root = loader.load();
Stage stage = new Stage();

stage.initStyle(StageStyle.UNDECORATED);
stage.setScene(new Scene(root));
stage.show();


//set your Stage width,height,x,y to zero

stage.setX(0);
stage.setY(0);
stage.setWidth(0);
stage.setHeight(0);
AnimationTimer t = new AnimationTimer() {
            @Override
            public void handle(long now) {
                stage.setX(stage.getX()+1);
                stage.setX(stage.getX()+1);
                stage.setWidth(stage.getWidth()+1);
                stage.setHeight(stage.getHeight()+1);
                // Here put your condition for "destination and desired size" 
                 // in this case everything will move/grow by 600 px
                if( stage.getX() == 600){
                    this.stop();
                    stage.setResizable(false);
                }
            }
        };
        t.start();

这看起来不够流畅,但您可以想出一个 "interpolation" 机制,使移动更加流畅。

编辑:

我忘记了!您还可以使用转换:

Animation transition = new Transition() {
    {
        setCycleDuration(Duration.millis(2000));
        setInterpolator(Interpolator.EASE_IN);
    }
    @Override
    protected void interpolate(double frac) {
        // frac is the percentage of how much time of the Transition
        // Already passed (1000 ms => frac = 0.5)
        // Here you just Multiply frac with the designated value
        stage.setHeight(height*frac);
        stage.setWidth(width*frac);
        stage.setX(x*frac);
        stage.setY(y*frac);        
    }
};
transition.play();

这往往会更平滑,因为您可以使用插值器