Gluon Mobile Charm 5.0 не может скрыть слой - PullRequest
0 голосов
/ 04 июня 2018

У меня есть загрузочный 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 голосов
/ 26 июня 2018

Так вот, что я сделал, чтобы решить это.Из Gluon Docs по методу hide():

Если этот слой отображается, вызов этого метода скроет его.Если присутствует скрытый переход, он воспроизводится перед тем, как скрыть слой. Необходимо позаботиться о том, чтобы вызвать его только после запуска LifecycleEvent.SHOWN.

Таким образом, я понял, что ответ от бэкэнда пришел до того, как слой был полностью показан,Таким образом, я изменил переопределенный метод hide() следующим образом:

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

Поэтому, если слой все еще находится в режиме LifecycleEvent.SHOWING, когда ему говорят, что он скрыт, убедитесь, что он скрывается, когда отображается.В противном случае он уже показан, поэтому скрывайте его.

0 голосов
/ 07 июня 2018

Проблема с вашим кодом: вы переопределяете Layer::layoutChildren, но не звоните super.layoutChildren().

Если вы отметили JavaDoc :

Переопределите этот метод, чтобы добавить логику макета для вашего слоя.Следует позаботиться о том, чтобы вызывать этот метод в переопределенных методах для правильного функционирования Слоя.

Это означает, что вы избавляетесь от некоторых важных частей элемента управления Слоя, таких как анимация, события и видимость.control.

Это должно работать:

@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.

...