Можно ли использовать переходы на блестящих слоях?

Я создал пользовательский слой по этому материалу: http://docs.gluonhq.com/charm/2.1.1/#_creating_a_layer и добавил его в свое приложение:

MobileApplication.getInstance().addLayerFactory(LAYER_NAME, () -> customLayer);

Теперь я хотел бы добавить переход к этому слою. Вы можете использовать переходы на View, например: view.setShowTransitionFactory(BounceInDownTransition:new)

Layer не предоставляет такой метод. Итак, я попробовал этот подход, чтобы применить переход:

private void showLayer() {
    MobileApplication.getInstance().showLayer(LAYER_NAME);
    new BounceInDownTransition(customLayer).play();
}

Когда я звоню showLayer() в первый раз, переход кажется незавершенным. Первая часть, где слой должен исчезнуть из поля зрения, отсутствует. Каждый последующий вызов showLayer() показывает полный переход.

Предусмотрены ли вообще слои для использования в сочетании с переходами? Если возможно, каков рекомендуемый способ?


person jns    schedule 06.04.2016    source источник
comment
выпуск новой версии Charm 2.2.0 уже включает слой переходы   -  person José Pereda    schedule 28.04.2016


Ответы (1)


Вы можете использовать встроенные переходы в Gluon Charm, поскольку все, что вам нужно, это передать им узел и вызвать play, чтобы запустить анимацию.

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

Это создаст эффект отскока для отображения и эффект отскока для скрытия.

public class MyLayer extends Layer {

    private final Node root;
    private final double size = 150;

    public MyLayer() {
        final BounceInDownTransition transitionIn = new BounceInDownTransition(this, true);
        final BounceOutDownTransition transitionOut = new BounceOutDownTransition(this, true);
        transitionOut.setOnFinished(e -> hide());

        Button button = new Button("", MaterialDesignIcon.CLOSE.graphic());
        button.setOnAction(e -> transitionOut.playFromStart());
        root = new StackPane(button);
        root.setStyle("-fx-background-color: white;");
        getChildren().add(root);

        getGlassPane().getLayers().add(this);

        showingProperty().addListener((obs, ov, nv) -> {
            if (nv) {
                layoutChildren();
                setOpacity(0);
                transitionIn.playFromStart();
            }
        });
    }

    @Override
    public void show() {
        getGlassPane().setBackgroundFade(GlassPane.DEFAULT_BACKGROUND_FADE_LEVEL);
        super.show();
    }

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

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

А теперь добавьте слой:

@Override
public void init() {
    addViewFactory(BASIC_VIEW, () -> new BasicView(BASIC_VIEW));

    addLayerFactory("My Layer", () -> new MyLayer());
}
person José Pereda    schedule 07.04.2016
comment
Да, я тоже это заметил. Я отредактировал свой ответ с исправлением: вызовите layoutChildren() перед запуском анимации. В любом случае, я создам внутреннюю проблему для этого. - person José Pereda; 07.04.2016
comment
Эта проблема должна быть исправлена ​​в выпуске нового Charm 2.2. .0 версия. Вы можете проверить? - person José Pereda; 28.04.2016