我如何 return 一个节点在旋转过渡后回到它的原始位置

How do i return a node to its original position after a rotation transition

我应用了一个鼠标输入的动作侦听器和一个鼠标退出的侦听器 button.when 鼠标悬停在按钮上,它旋转并在退出时假设停止并且 return回到原来的位置,但不幸的是我不知道如何实现这一点……有什么想法吗?这是我的。

 finishButton.setOnMouseEntered(event -> {
        buttonRotateAnimation(finishButton);
        play();
    });

    finishButton.setOnMouseExited(event ->{

        stop();


    });

创建方法

public RotateTransition buttonRotateAnimation(Button button){
    rotateTransition = new RotateTransition(Duration.seconds(2),button);
    rotateTransition.setFromAngle(0);
    rotateTransition.setToAngle(720);
    rotateTransition.setCycleCount(Timeline.INDEFINITE);
    rotateTransition.setAutoReverse(true);

    return rotateTransition;
}

public void play() {
    rotateTransition.play();
}


public void stop() {
    rotateTransition.stop();
}

您可以将 ChangeListener 添加到 statusProperty,当状态为 Status.STOPPED 时,您只需像这样添加另一个 RotateTransition:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {

            StackPane root = new StackPane();

            Button button = new Button( "I'm rotating!");

            RotateTransition rotateTransition = createRotateTransition(button);

            button.addEventFilter(MouseEvent.MOUSE_ENTERED, e -> {
                rotateTransition.play();
            });

            button.addEventFilter(MouseEvent.MOUSE_EXITED, e -> {
                rotateTransition.stop();
            });

            root.getChildren().add( button);

            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public RotateTransition createRotateTransition(Button button){

        RotateTransition rotateTransition = new RotateTransition(Duration.seconds(2),button);

        rotateTransition.setFromAngle(0);
        rotateTransition.setToAngle(720);
        rotateTransition.setCycleCount(Timeline.INDEFINITE);
        rotateTransition.setAutoReverse(true);

        rotateTransition.statusProperty().addListener(new ChangeListener<Status>() {

            @Override
            public void changed(ObservableValue<? extends Status> observable, Status oldValue, Status newValue) {

                if( newValue == Status.STOPPED) {

                    RotateTransition transition = new RotateTransition(Duration.seconds(2),button);

                    transition.setFromAngle(button.getRotate());
                    transition.setToAngle(0);
                    transition.setCycleCount(1);
                    transition.setAutoReverse(true);
                    transition.play();

                }

            }

        });
        return rotateTransition;
    }


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