问题
在我的应用程序中,我使用了无限的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中,它说:“停止动画并将播放头重置为其初始位置。”因此,播放头将重置,但由于过渡停止,此重置不会传输到节点。有办法利用它吗?
答案 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);
});