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。您可以在这里阅读更多内容:
我想创建一个工具栏。如果我单击一个图标,应该打开一个列表。我使用 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。您可以在这里阅读更多内容: