2

我根据以下材料创建了一个自定义层: http ://docs.gluonhq.com/charm/2.1.1/#_creating_a_layer ,并将其添加到我的应用程序中:

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

现在我想为这一层添加一个过渡。您可以使用以下转换Viewview.setShowTransitionFactory(BounceInDownTransition:new)

Layer没有提供这样的方法。所以我尝试了这种方法来应用过渡:

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

当我showLayer()第一次打电话时,过渡似乎不完整。第一部分,图层应该被转移到视野之外的地方,丢失了。每次进一步调用showLayer()显示完整的转换。

层是否意味着与过渡结合使用?如果可能的话,推荐的方法是什么?

4

1 回答 1

2

您可以使用 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());
}
于 2016-04-07T14:06:47.360 回答