重置无限的JavaFX RotateTransition

时间:2018-09-13 07:55:21

标签: javafx rotation transition

问题

在我的应用程序中,我使用了无限的RotateTransition。

    Button btnRotating = new Button("I'm rotating");
    final RotateTransition rt = new RotateTransition(Duration.millis(2000), btnRotating);
    rt.setFromAngle(0);
    rt.setToAngle(180);
    rt.setInterpolator(Interpolator.LINEAR);
    rt.setCycleCount(Timeline.INDEFINITE);

当我停止此过渡时,我想将旋转的节点重置为其初始位置。

rt.stop();
rt.getNode().setRotate(0);

问题在于rt.stop()是异步的,因此当我重置节点的旋转时,过渡可能尚未停止。因此,有时过渡会覆盖我的轮播重置。

解决方案失败

rt.onFinishedProperty().addListener((observable, oldValue, newValue) -> {
    rt.getNode().setRotate(0);
});

当过渡的onFinishedProperty更改不起作用时执行rt.getNode()。setRotate(0),因为手动停止过渡不会触发onFinishedProperty。

rt.statusProperty().addListener((observable, oldValue, newValue) -> {
    if(newValue == Status.STOPPED){
        rt.getNode().setRotate(0);
    }
});

监听过渡的statusProperty具有与手动重置旋转相同的问题。一旦我调用rt.stop(),status属性就会设置为STOPPED,但是它不会等到转换终止。

问题

那么我如何安全地将节点重置为其初始位置?重置节点后,如何确定过渡真正结束? 当我在JavaFX应用程序线程上执行rt.getNode()。setRotate(0)时,由于我的重置旋转在上次转换旋转之后进入队列,因此它似乎可以可靠地工作。这是最好的解决方案吗? rt.stop()和rt.start是否也应该在FX线程上执行?

我注意到的另一件事是,在rt.stop()函数的JavaDoc中,它说:“停止动画并将播放头重置为其初始位置。”因此,播放头将重置,但由于过渡停止,此重置不会传输到节点。有办法利用它吗?

1 个答案:

答案 0 :(得分:0)

btnRotating.setOnAction(event -> {
    if (rt.statusProperty().get() == Animation.Status.RUNNING){
        rt.stop();
        btnRotating.setRotate(0);
    }else{
        rt.playFromStart();
    }
});

您可以通过使用此按钮来停止背景中的动画

Platform.runLater(() -> {
    rt.stop();
    btnRotating.setRotate(0);
});