首页 > 解决方案 > Java FX TranslateTransition 持续时间更改

问题描述

所以我希望能够通过改变持续时间来改变动画的速度。我知道 Java Docs 说它不能完成,但我认为停止动画、更改 Duration 并从它停止的点开始没有任何问题。有了这个实现,我的圈子就停止了,不想再移动了。我能以某种方式做到吗?如果我不能,我如何制作具有可变速度的动画?

编辑:它确实有效,但是当我更改持续时间时,起点会发生变化,而终点不会因此变得越来越接近终点,直到它停止(除非我只在圆圈是接近初始起点)。对只会影响动画速度的算法有什么想法吗?

public void initialize() { 
          TranslateTransition transition = new TranslateTransition();
          transition.setDuration(Duration.seconds(2));
          transition.setToX(162);
          transition.setToY(72);
          transition.setAutoReverse(true);
          transition.setCycleCount(TranslateTransition.INDEFINITE);
          transition.setNode(myCircle);
          transition.play();


        mySlider.valueProperty().addListener(new ChangeListener() {

            @Override
            public void changed(ObservableValue arg0, Object arg1, Object arg2) {

                transition.stop();
                Duration d = transition.getDuration();
                transition.setDuration(Duration.seconds(mySlider.getValue()));
                transition.playFrom(d);
                System.out.println(mySlider.getValue());

            }
        });
    }

标签: javajavafx

解决方案


编辑:它确实有效,但是当我更改持续时间时,起点会发生变化,而终点不会因此变得越来越接近终点,直到它停止(除非我只在圆时改变速度接近初始起点)。

由于您没有指定 和 的起始值translateXtranslateY因此TranslateTransition在从停止状态转换到另一个状态时获取这些属性的当前值。由于您确实停止了过渡,因此每次更改滑块都会发生这种情况。那时翻译属性的值可能与起始位置不同。
此外,如果您减小持续时间滑块的值,则传递给该playFrom方法的时间可能是在循环结束之后。

我建议改为修改rate属性:

TranslateTransition transition = new TranslateTransition();
transition.setDuration(Duration.seconds(1));
...

transition.rateProperty().bind(Bindings.divide(1d, mySlider.valueProperty()));

推荐阅读