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();
这往往会更平滑,因为您可以使用插值器
如何在舞台变换时制作动画?
-例如,我有 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();
这往往会更平滑,因为您可以使用插值器