JavaFX 飞行动画

64 篇文章 12 订阅


 

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Duration;

public class FlyToPointTest extends Application {

    private String flyToObject = null;

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

    @Override
    public void start(Stage primaryStage) {
        ObservableList<String> options = FXCollections.observableArrayList();
        options.add("红圆");
        options.add("绿圆");
        options.add("蓝圆");

        ComboBox<String> circleChooseComboBox = new ComboBox<>();
        circleChooseComboBox.setItems(options);
        circleChooseComboBox.setTranslateX(10);
        circleChooseComboBox.setTranslateY(0);

        circleChooseComboBox.getSelectionModel().selectedItemProperty().addListener((ObservableValue<? extends String> arg0, String arg1, String arg2) -> {
            if (arg2 != null) {
                flyToObject = arg2;
            }
        });

        Circle circleA = new Circle(50, 50, 5);
        circleA.setFill(Color.RED);

        Circle circleB = new Circle(400, 200, 5);
        circleB.setFill(Color.GREEN);

        Circle circleC = new Circle(300, 300, 5);
        circleC.setFill(Color.BLUE);

        Button button = new Button("飞起来");
        button.setTranslateX(100);
        button.setTranslateY(0);

        Pane pane = new Pane();
        pane.setPrefWidth(800);
        pane.setPrefHeight(400);

        Pane childPane = new Pane();
        childPane.setPrefHeight(350);
        childPane.setPrefWidth(780);
        childPane.setTranslateX(10);
        childPane.setTranslateY(40);
        childPane.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT,null,null)));

        Rectangle rectangle = new Rectangle();
        rectangle.setStroke(Color.GRAY);
        rectangle.setHeight(350);
        rectangle.setWidth(780);
        rectangle.setTranslateX(10);
        rectangle.setTranslateY(40);
        rectangle.setFill(null);

        childPane.getChildren().addAll(circleA, circleB, circleC);

        double middleXInPane = pane.getPrefWidth() / 2;
        double childPaneStartTranslateY = childPane.getTranslateY();
        double middleYInPane = childPaneStartTranslateY + childPane.getPrefHeight() / 2;
        Line horizontalLine = new Line(middleXInPane - 10, middleYInPane, middleXInPane + 10, middleYInPane);
        horizontalLine.setStroke(Color.GRAY);
        Line verticalLine = new Line(middleXInPane, middleYInPane - 10, middleXInPane, middleYInPane + 10);
        verticalLine.setStroke(Color.GRAY);
        pane.getChildren().addAll(horizontalLine, verticalLine, childPane, rectangle, button, circleChooseComboBox);

        /*childPane.setBorder((new Border(new BorderStroke(Color.GRAY,
                new BorderStrokeStyle(StrokeType.OUTSIDE, StrokeLineJoin.ROUND, StrokeLineCap.ROUND, 10, 0, null),
                CornerRadii.EMPTY, new BorderWidths(3)))));*/

        Timeline timeline = new Timeline();
        button.setOnAction(event -> {
            Circle circle = null;
            if(flyToObject == null){
                Alert alert = new Alert(Alert.AlertType.WARNING, "你未选择圆", ButtonType.CLOSE);
                alert.show();
                return;
            }

            switch (flyToObject) {
                case "红圆":
                    circle = circleA;
                    break;
                case "绿圆": {
                    circle = circleB;
                    break;
                }
                case "蓝圆": {
                    circle = circleC;
                    break;
                }
            }

            timeline.getKeyFrames().clear();
            // 圆和中心点的距离
            double distanceX = middleXInPane - (childPane.getTranslateX() + circle.getCenterX());
            double distanceY = middleYInPane - (childPane.getTranslateY() + circle.getCenterY());
            if (circle != null) {
                timeline.getKeyFrames().addAll(new KeyFrame(new Duration(0), new KeyValue(childPane.translateXProperty(), childPane.getTranslateX())),
                        new KeyFrame(new Duration(1000), new KeyValue(childPane.translateXProperty(), childPane.getTranslateX() + distanceX)));
                timeline.getKeyFrames().addAll(new KeyFrame(new Duration(0), new KeyValue(childPane.translateYProperty(), childPane.getTranslateY())),
                        new KeyFrame(new Duration(1000), new KeyValue(childPane.translateYProperty(), childPane.getTranslateY() + distanceY)));
            }

            timeline.play();
        });

        primaryStage.setResizable(false);
        primaryStage.setScene(new Scene(pane, 800, 400));
        primaryStage.show();
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值