我怎样才能知道节点上是否已经运行了转换 - 例如FadeTransition
?
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类的文档,因为它是一个非常强大的对象。希望对你有帮助,加油
谢谢您的帮助。我想分享我最终为我的具体问题选择的解决方案。它如下:我想在鼠标点击时淡化一个节点。当出现大量点击时,FadeTransition
只有在当前点击完成后才开始新的,以防止闪烁或其他现象。
我的方法可以在函数的第一行看到:
@FXML
public void chartMouseClicked(MouseEvent event){
if (ft.getCurrentRate()!=0.0d) return;
ft.play();
}
在这种情况下,是在“init”函数中实例化一次ft
的类型的私有字段。FadeTransition
根据 JavaFX 文档,当转换暂停或停止时getCurrentRate()
返回。0.0
我不需要暂停过渡,所以这是适合我的方法 - 我只是检查值并让我的过渡在停止时再次播放。
注意:我自己没有尝试过与此相关的任何事情。这更像是一个草图而不是一个解决方案。评论太长了,这就是我在这里写大纲的原因。
在我看来,您可以创建一个与节点关联的布尔值(“transitionPlaying”),并且每次在节点上启动转换时,您将其设置为 true。
然后为每个转换定义一个行为,当它完成时:
yourTransition.setOnFinished(new EventHandler<ActionEvent>(){
public void handle(ActionEvent AE){
transitionPlaying = false;
}
请注意,这仅回答了您最基本的问题-很难写更多内容,因为我不知道您为什么想知道转换是否完成(如果您想在转换完成后做一些事情,那将打开一个整体蠕虫罐头。也许如果正在播放转换,您可以将要运行的下一个转换添加到队列中,然后定义 setOnFinished 以在完成时调用队列中的下一个转换。)
附言。这个解决方案有一个限制,即在任何时候最多只能在一个节点上播放一个转换。
更新以查找节点上的所有转换是否都已完成
您可以使用 int 而不是 bool,并且对于开始的每个转换,您将计数器加一,完成后将其减一。这样您就知道当计数器读数为“0”时所有转换都已完成。这样我的解决方案解决了知道节点上的所有转换是否都完成的问题。