如何为JavaFX舞台创建Resize动画



我一直在尝试为JavaFX阶段进行缩放转换,以替换应用程序主窗口的当前场景(在本例中为登录帧)
当这种情况发生时,由于新场景更大,窗口会以一种不优雅的方式突然重新调整大小。

有没有任何方法可以设置缩放或重新调整大小的过渡,以实现舞台大小调整?

相关代码:

InputStream is = null;
try {
    is = getClass().getResourceAsStream("/fxml/principal.fxml");
    Region pagina = (Region) cargadorFXML.load(is);
    cargadorFXML.<ContenedorPrincipal>getController().setEscenario(escenario);
    final Scene escena = new Scene(pagina, 900, 650);
    escena.setFill(Color.TRANSPARENT);
    escenario.setScene(escena);
    escenario.sizeToScene();
    escenario.centerOnScreen();
    escenario.show();
} catch (IOException ex) {
    // log "Unable to load the main application driver"
    log.error("No fue posible cargar el controlador principal de la aplicación."); 
    log.catching(ex);
} finally {
    if (is != null) {
        try {
            is.close();
        } catch (IOException e) {}
    }
}

您也可以使用Timeline的动画机制
这里提供了一些示例。

唯一的问题是Stage没有可写的高度或宽度属性,您必须自己创建它。以下示例。

WritableValue<Double> writableHeight = new WritableValue<Double>() {
    @Override
    public Double getValue() {
        return stage.getHeight();
    }
    @Override
    public void setValue(Double value) {
        stage.setHeight(value);
    }
};

我真的很喜欢你的想法,所以我设法做了一些事情。我希望这对你有帮助。

我用Timer每隔25毫秒改变一次舞台的宽度和高度,以给人一种动画的印象。

import java.util.Timer;
import java.util.TimerTask;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class SmoothResize extends Application {
    @Override
    public void start(final Stage stage) throws Exception {
        stage.setTitle("Area Chart Sample");
        Group root = new Group();
        Scene scene  = new Scene(root, 250, 250);
        stage.setResizable(false);
        Timer animTimer = new Timer();
        animTimer.scheduleAtFixedRate(new TimerTask() {
            int i=0;
            @Override
            public void run() {
                if (i<100) {
                    stage.setWidth(stage.getWidth()+3);
                    stage.setHeight(stage.getHeight()+3);
                } else {
                    this.cancel();
                }
                i++;
            }
        }, 2000, 25);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

最新更新