Как создать анимацию Resize для этапа JavaFX?

Я пытаюсь сделать переход масштабирования для этапа 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) {}
    }
}

Ответ 1

Мне очень понравилась твоя идея, поэтому мне удалось кое-что сделать. Надеюсь, это поможет вам.

Я использовал 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);
    }
}

Ответ 2

Вы также можете использовать механизм анимации с Timeline.
Ниже приведен пример здесь.

Единственная проблема заключается в том, что Stage не имеет возможности записи высоты или ширины, и вы должны создать ее самостоятельно. Пример ниже.

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

    @Override
    public void setValue(Double value) {
        stage.setHeight(value);
    }
};