Make JavaFX wait and continue with code

后端 未结 2 1022
余生分开走
余生分开走 2020-12-05 16:05

Basically I am trying to make a short effect using JavaFX. I have the shape of a heart (added together from two circles and a polygon) that I can vary in size using the doub

2条回答
  •  春和景丽
    2020-12-05 16:28

    Dave's solution is great for general purpose off thread based work in JavaFX.

    If you wish to use the animation facilities of JavaFX, the solutions below demonstrate this using a Timeline or a ScaleTransition. The timeline implements a discrete scale of the UI element, so every quarter of a second the UI element is scaled larger or back to it's original size. The scale transition implements a smooth scale of the UI element, so the UI element gradually gets larger then smaller using an interpolated scale factor with the default easing interpolator.

    import javafx.animation.*;
    import javafx.application.Application;
    import javafx.beans.property.*;
    import javafx.scene.Scene;
    import javafx.scene.image.ImageView;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    import javafx.util.Duration;
    
    public class BeatingHeart extends Application {
        public static void main(String[] args) {
            launch(args);
        }
    
        public void start(Stage stage) {
            ImageView heart = new ImageView(HEART_IMAGE_LOC);
    
            animateUsingTimeline(heart);
    //        animateUsingScaleTransition(heart);
    
            StackPane layout = new StackPane(heart);
            layout.setPrefWidth(heart.getImage().getWidth() * 2);
            layout.setPrefHeight(heart.getImage().getHeight() * 2);
    
            Scene scene = new Scene(layout);
            stage.setScene(scene);
            stage.show();
        }
    
        private void animateUsingTimeline(ImageView heart) {
            DoubleProperty scale = new SimpleDoubleProperty(1);
            heart.scaleXProperty().bind(scale);
            heart.scaleYProperty().bind(scale);
    
            Timeline beat = new Timeline(
                new KeyFrame(Duration.ZERO,         event -> scale.setValue(1)),
                new KeyFrame(Duration.seconds(0.5), event -> scale.setValue(1.1))
            );
            beat.setAutoReverse(true);
            beat.setCycleCount(Timeline.INDEFINITE);
            beat.play();
        }
    
        private void animateUsingScaleTransition(ImageView heart) {
            ScaleTransition scaleTransition = new ScaleTransition(
                Duration.seconds(1), heart
            );
            scaleTransition.setFromX(1);
            scaleTransition.setFromY(1);
            scaleTransition.setFromZ(1);
            scaleTransition.setToX(1.1);
            scaleTransition.setToY(1.1);
            scaleTransition.setToZ(1.1);
            scaleTransition.setAutoReverse(true);
            scaleTransition.setCycleCount(Animation.INDEFINITE);
            scaleTransition.play();
        }
    
        private static final String HEART_IMAGE_LOC =
                "http://icons.iconarchive.com/icons/mirella-gabriele/valentine/128/Heart-red-icon.png";
        // icon obtained from: http://www.iconarchive.com/show/valentine-icons-by-mirella-gabriele/Heart-red-icon.html
        // icon license: Free for non-commercial use, commercial use not allowed.
    }
    

提交回复
热议问题