Gluon Mobile Charm 5.0无法隐藏图层

时间:2018-06-04 01:02:19

标签: gluon gluon-mobile

我有一个加载所有后端请求的gif。在Charm 5.0.0之前,它工作正常,加载gif会显示,后端将完成它所需的,然后加载GIF将被隐藏。现在,加载gif显示但它没有隐藏。

addLayerFactory(LOADING_GIF, () -> new Layer() {
            private final Node root;
            private final double sizeX = getGlassPane().getWidth();
            private final double sizeY = getGlassPane().getHeight();

            {
                ProgressIndicator loading = new ProgressIndicator();
                loading.setRadius(50);
                loading.setStyle("-fx-text-fill:white");
                root = new StackPane(loading);
                root.setStyle("-fx-background-color: rgba(0,0,0,0);");
                getChildren().add(root);
                this.setStyle("-fx-background-color:rgba(255,255,255,0.7)");
                this.setShowTransitionFactory(v -> {
                    FadeInTransition ft = new FadeInTransition(v);
                    ft.setRate(2);
                    return ft;
                });
            }

            @Override
            public void show() {
                this.setBackgroundFade(0.0);
                super.show();
                Layer pane = this;
                Task<Integer> task = new Task<Integer>() {
                    @Override
                    protected Integer call() throws Exception {
                        int iterations = 0;
                        int max = DataService.readOutTime / 1000;
                        while (iterations <= max) {
                            Thread.sleep(1000);
                            iterations++;
                        }
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                if (pane.isVisible()) {
                                    pane.setShowTransitionFactory(v -> {
                                        FadeOutTransition ft = new FadeOutTransition(v);
                                        ft.setRate(2);
                                        return ft;
                                    });
                                    pane.hide();
                                    MobileApplication.getInstance().showMessage("There was an error in sending your data.");
                                }
                            }
                        });
                        return iterations;
                    }
                };
                Thread thread = new Thread(task);
                thread.start();
            }

            @Override
            public void hide() {
                this.setBackgroundFade(0.0);
                super.hide();
            }

            @Override
            public void layoutChildren() {
                root.setVisible(isShowing());
                if (!isShowing()) {
                    return;
                }
                root.resize(sizeX, sizeY);
                resizeRelocate((getGlassPane().getWidth() - sizeX) / 2, (getGlassPane().getHeight() - sizeY) / 2, sizeX, sizeY);
            }
        });

我有几个显示和隐藏加载程序的实用程序方法:

public void showLoader() {
    MobileApplication.getInstance().showLayer(App.LOADING_GIF);
}

public void hideLoader() {
    MobileApplication.getInstance().hideLayer(App.LOADING_GIF);
}

有趣的是,我创建的自定义超时(以便在后端存在停顿时隐藏加载程序)也不会隐藏该层。

2 个答案:

答案 0 :(得分:0)

您的代码存在问题:您已覆盖Layer::layoutChildren,但未致电super.layoutChildren()

如果您查看JavaDoc

  

重写此方法以添加图层的布局逻辑。应注意在覆盖方法中调用此方法以使图层正常运行。

这意味着您正在摆脱图层控件的一些重要部分,例如动画,事件和可见性控制。

这应该有效:

@Override
public void layoutChildren() {
    super.layoutChildren();
    root.setVisible(isShowing());
    if (!isShowing()) {
        return;
    }
    root.resize(sizeX, sizeY);
    resizeRelocate(getGlassPane().getWidth() - sizeX) / 2, getGlassPane().getHeight() - sizeY) / 2, sizeX, sizeY);
}

另外,对于隐藏转换,您应该使用setHideTransitionFactory

答案 1 :(得分:0)

这就是我为解决此问题所做的事情。在hide()方法的Gluon文档中:

  

如果显示此层,则调用此方法将其隐藏。如果存在隐藏过渡,则在隐藏图层之前将其播放。 只有在LifecycleEvent.SHOWN被触发后,才应注意调用此函数。

因此,我意识到来自后端的响应是在完全显示该层之前出现的。因此,我修改了覆盖的hide()方法,如下所示:

@Override
public void hide() {
   if (this.isShowing()) {
     this.setOnShown(e -> {
        this.setBackgroundFade(0.0);
        super.hide();
     });
   } else {
     super.hide();
   }
}

因此,如果在被告知隐藏时该层仍处于LifecycleEvent.SHOWING模式,请确保在显示该层时将其隐藏。否则它已经显示出来了,请将其隐藏。