Как добавить анимацию для минимизации JavaFX? - PullRequest
2 голосов
/ 28 октября 2019

Я использую библиотеку AnimateFX, которая является просто компиляцией анимаций узлов.

AnimationFX fx = new ZoomOut(background);
fx.setOnFinished(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent actionEvent) {
        //background.setScaleX(1.0D);
        //background.setScaleY(1.0D);
        //background.setScaleZ(1.0D);
        //background.setOpacity(1.0D);

        // -- some wait function --

        Stage stage = (Stage) background.getScene().getWindow();
        stage.setIconified(true);
    }
});
fx.play();

Этот блок приводит к минимизации окна, но теперь оно прозрачно и незначительно.

Если я раскомментирую преобразования узла фона и прокомментирую stage.setIconified(true), анимация завершается возвращением окна в полный размер, как и ожидалось.

Однако, если я раскомментирую преобразования узла фона без комментированияstage.setIconified(true), программа сворачивается без запуска фоновых преобразований узлов.

Я предположил, что это была некоторая проблема с синхронизацией, но добавление функции ожидания в // -- some wait function -- просто привело к тому, что программа ожидала без выполнения фоновых преобразований узла и затем сворачивала.

Немного смущен тем, почему это происходит.

РЕДАКТИРОВАТЬ

Вот некоторый исполняемый код, который воспроизводит проблему. Я обнаружил, что если я заменил ImageView на Button и изменил событие на действие кнопки, то проблема больше не возникает.

package app;

import animatefx.animation.AnimationFX;
import animatefx.animation.ZoomOut;
import javafx.fxml.FXML;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Controller {

    @FXML
    VBox background;
    @FXML
    ImageView minimize;

    @FXML
    public void onMinimizeClicked(MouseEvent mouseEvent) {
        AnimationFX fx = new ZoomOut(background);
        fx.setSpeed(0.75D);
        fx.setResetOnFinished(true);
        Stage stage = (Stage) background.getScene().getWindow();
        fx.setOnFinished(actionEvent -> stage.setIconified(true));
        fx.play();
    }

}

Edit # 2

Вот мой основной класс

package app;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        Scene scene = new Scene(root);
        scene.setFill(Color.TRANSPARENT);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Вот мой файл sample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>

<VBox fx:id="background" prefHeight="500.0" prefWidth="400.0" style="-fx-background-color: transparent" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="app.Controller">
  <AnchorPane fx:id="content" prefHeight="464.0" prefWidth="500.0" style="-fx-background-color: #3D4956&#10;" VBox.vgrow="ALWAYS">
    <children>
      <ImageView fx:id="minimize" fitHeight="150.0" fitWidth="200.0" layoutX="100.0" layoutY="175.0" onMouseClicked="#onMinimizeClicked" pickOnBounds="true" preserveRatio="true" />
    </children>
  </AnchorPane>
</VBox>

1 Ответ

0 голосов
/ 29 октября 2019

Я не знаю причину такого поведения, но мне удалось устранить ее, добавив изображение внутри ImageView в FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>

<VBox fx:id="background" prefHeight="500.0" prefWidth="400.0" style="-fx-background-color: transparent" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="sample.Controller">
<AnchorPane fx:id="content" prefHeight="464.0" prefWidth="500.0" style="-fx-background-color: #3D4956&#10;" VBox.vgrow="ALWAYS">
    <children>
        <ImageView fx:id="minimize" fitHeight="150.0" fitWidth="200.0" layoutX="100.0" layoutY="175.0" onMouseClicked="#onMinimizeClicked" pickOnBounds="true" preserveRatio="true" >
            <Image url="file:image/iamge.png"/>
        </ImageView>
    </children>
</AnchorPane>
</VBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...