Сбросить бесконечный JavaFX RotateTransition - PullRequest
0 голосов
/ 13 сентября 2018

Задача

В моем приложении я использую бесконечный 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);
});

Выполнение rt.getNode (). SetRotate (0), когда onFinishedProperty изменений перехода не работает, так как остановка перехода вручную не вызывает onFinishedProperty.

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

Прослушивание статуса Свойство перехода имеет ту же проблему, что и сброс вращения вручную. Для свойства status устанавливается значение STOPPED, как только я вызываю rt.stop (), но оно не ожидает завершения перехода.

Вопрос

Так как я могу безопасно сбросить свой узел в исходное положение? Как я могу определить, что переход действительно завершился после сброса узла? Когда я выполняю rt.getNode (). SetRotate (0) в потоке приложения JavaFX, кажется, что он работает надежно, так как мой поворот сброса ставится в очередь после последнего вращения перехода. Это лучшее решение? Должны ли rt.stop () и rt.start также выполняться в потоке FX?

Еще одна вещь, которую я заметил, это то, что в JavaDoc функции rt.stop () написано: «Останавливает анимацию и сбрасывает головку воспроизведения в исходное положение». Таким образом, игровая головка сбрасывается, но этот сброс не передается на узел, так как переход остановлен. Есть ли способ использовать это?

1 Ответ

0 голосов
/ 13 сентября 2018
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);
});
...