如何确定转换是否已在节点上运行?

时间:2012-09-30 18:13:17

标签: javafx-2

如何判断节点上是否已经有转换运行 - 例如FadeTransition

3 个答案:

答案 0 :(得分:3)

您可以随时使用Transition statusProperty,因为Transition会扩展Animation对象。不需要另一个变量,你可以简单地说:

FadeTransition fade = new FadeTransition()
fade.statusProperty().addListener(new ChangeListener<Status>() {

        @Override
        public void changed(ObservableValue<? extends Status> observableValue,
                        Status oldValue, Status newValue) {
                if(newValue==Status.RUNNING)
                    System.out.println("Animation is still running");

            }
        });
fade.play();

我假设您将跟踪所有动画,我不相信有一种方法可以询问节点是否在动画中。无论如何,您可能想查看Node类的文档,因为它是一个非常强大的对象。我希望它有所帮助,欢呼

答案 1 :(得分:1)

注意:我自己没有尝试过与此相关的任何事情。这更像是草图而不是解决方案。评论太长了,这就是我在这里写大纲的原因。

在我看来,您可以创建一个与节点关联的布尔值(“transitionPlaying”),每次在节点上启动转换时,都会将其设置为true。

然后,对于每个转换,您在完成时定义行为:

yourTransition.setOnFinished(new EventHandler<ActionEvent>(){
    public void handle(ActionEvent AE){
        transitionPlaying = false; 
}

请注意,这只是回答你最基本的问题 - 很难写更多内容,因为我不知道为什么你想知道转换是否已经完成(如果你想在转换完成后做一些事情,那就是打开一大堆蠕虫。也许如果正在进行转换,您可以将要运行的下一个转换添加到队列中,然后定义setOnFinished以在完成时调用队列中的下一个转换。)

聚苯乙烯。此解决方案的限制是,任何时刻最多只能有一个转换在节点上播放。

更新以查找节点上的所有转场是否已完成

您可以使用int而不是bool,并且对于每个开始的转换,您将计数器递增1,当它完成时,您将其递减1。这样,您就知道当计数器读为“0”时,所有转换都会完成。这样我的解决方案就可以解决知道节点上所有转换是否完成的问题。

答案 2 :(得分:0)

感谢您的帮助。我想分享我最后为我的具体问题选择的解决方案。它的内容如下:我想在鼠标点击时淡化节点。当出现大量点击时,新的FadeTransition只应在当前的点击完成时开始,以防止闪烁或其他现象。

我的方法可以在函数的第一行看到:

@FXML
public void chartMouseClicked(MouseEvent event){
    if (ft.getCurrentRate()!=0.0d) return;      
    ft.play();
}

在这种情况下,ftFadeTransition类型的私有字段,它在“init”函数中实例化一次。根据JavaFX文档,当转换暂停或停止时,getCurrentRate()会返回0.0。我不需要暂停转换,所以这是我的选择 - 我只是检查价值,让我的转换在停止时再次播放。