libGDX: 创建工具栏

libGDX: Create a toolBar

我想创建一个工具栏。如果我单击一个图标,应该打开一个列表。我使用 Stack 添加容器(图标列表)并向其添加 Table。 (所以所有的东西都在调整时缩放,不需要在那里做任何工作)

但我无法通过 container.setX(float) 设置 X 轴。但是列表必须在点击的图标下打开。

是否有更好的方法或方法来设置 X 而无需对齐?

private void rebuildStage() {
    VerticalGroup toolBar = buildToolBar();

    VerticalGroup vGroup = new VerticalGroup();
    vGroup.fill().setFillParent(true);
    vGroup.addActor(toolBar);

    clear();
    addActor(vGroup);
}

private VerticalGroup buildToolBar() {
    ImageButton btnFile = new ImageButton(Assets.instance.btn_skin, "file");
    ImageButton btnArrangement = new ImageButton(Assets.instance.btn_skin, "arrangement");
    ImageButton btnCollision = new ImageButton(Assets.instance.btn_skin, "collision");

    ButtonGroup<ImageButton> buttonGroup = new ButtonGroup<ImageButton>(btnFile, btnArrangement, btnCollision);
    buttonGroup.setMinCheckCount(0);

    Container<Table> tableFile = new Container<Table>(buildTableFile());
    tableFile.top().left();
    Container<Table> tableArrangement = new Container<Table>(buildTableArrangement());
    tableArrangement.top();
    Container<Table> tableCollision = new Container<Table>(buildTableCollision());
    tableArrangement.top();

    Stack stack = new Stack();
    stack.add(tableFile);
    stack.add(tableArrangement);
    stack.add(tableCollision);

    Table layer = new Table(Assets.instance.bg_skin);
    layer.setBackground("bg_table");
    layer.left();
    layer.add(btnFile).padLeft(10);
    layer.add(btnArrangement).padLeft(10);
    layer.add(btnCollision).padLeft(10);

    VerticalGroup vGroup = new VerticalGroup();
    vGroup.fill();
    vGroup.addActor(layer);
    vGroup.addActor(stack);
    return vGroup;
}

    private Table buildTableFile() {
    ImageButton button1 = new ImageButton(Assets.instance.btn_skin, "load");
    ImageButton button2 = new ImageButton(Assets.instance.btn_skin, "save");
    ImageButton button3 = new ImageButton(Assets.instance.btn_skin, "new");

    Table layer = new Table(Assets.instance.bg_skin);
    layer.setBackground("bg_table");
    layer.add(button1).pad(10, 10, 0, 10).row();
    layer.add(button2).pad(10, 10, 0, 10).row();
    layer.add(button3).pad(10, 10, 10, 10).row();
    return layer;
}

您可以为您的工具栏创建一个新的舞台您有图标的舞台上。

您需要做的就是将 ClickListener 附加到 toolbarStage,它将检查点击的位置并呈现在 toolbarStage 上有工具栏 - 当然你可以有另一个 ClickListener,它将在旧的 iconsStage 上为工具栏设置变量集(我假设它的工作与您单击的图标有关。

Stage iconsStage;
Viewport iconsStageViewport;

Stage toolbarStage;
Viewport toolbarStageViewport;

public void prepareStages()
{
    ... //here you are creating iconsStage, filling it with actors etc...

    toolbarStage = new Stage();
    toolbarStageViewport = ... //create any viewport you need

    toolbarStage.setViewport(toolbarStageViewport );

    ... //now add to toolbarStage a proper listener and listeners to icons etc...
}

...

public void render()
{
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    iconsStageViewport.update(this.screenWidth, this.screenHeight);
    iconsStage.act();
    iconsStage.draw();

    toolbarStageViewport.update(this.screenWidth, this.screenHeight);
    toolbarStage.act();
    toolbarStage.draw();
}

请记住,您不能在不使用 InputMultiplexer 的情况下使用多个 Stage。您可以在这里阅读更多内容:

https://github.com/libgdx/libgdx/wiki/Event-handling