libgdx 同时更新标签文本和位置
libgdx update label text and position simultaniously
我想做的是添加一个标签以跟随滑块旋钮并显示旋钮的值。我目前有一个垂直滑块和一个堆叠在 table 单元格内的标签。我能够将标签定位到旋钮所在的位置并正确更新它的文本,但在移动旋钮时遇到问题。
当我移动旋钮时,只要我不更新文本,我就可以让标签跟随它。但是,如果我更新文本,那么标签会在单元格中重新居中,直到旋钮停止移动,此时它会将自己放在旋钮上。
如何使标签在更新文本时不会重新定位?
这是我正在进行的一些示例代码:
public class OptionsWindow implements Screen {
private Stage stage;
private Table table;
private Slider slider;
private Label label;
private Skin textSkin = new Skin(Gdx.files.internal("skins/skin.json"),
new TextureAtlas(Gdx.files.internal("skins/text.pack")));
private Skin sliderSkin = new Skin(Gdx.files.internal("skins/skin.json"),
new TextureAtlas(Gdx.files.internal("skins/text.pack")));
private min = 1, max = 2;
@Override
public void show() {
stage = new Stage();
table = new Table();
slider = new Slider(min, max, 0.001f, true, sliderSkin);
label = new Label(""), textSkin);
table.stack(label, slider).height(1000);
table.setFillParent(true);
stage.addActor(table);
Gdx.input.setInputProcessor(stage);
}
@Override
public void render() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
label.setY(slider.getValue() - min);
label.setText(slider.getValue());
stage.act();
stage.draw();
}
}
我为这个问题的答案做了很多搜索,但没有找到任何结果。我也试过将标签放在容器中并在更改标签文本的同时移动容器,但结果相同。我敢肯定以前有人这样做过。这似乎是人们想要的东西。拜托,欢迎任何帮助。
以前从未做过,我总是在滑块旁边或上方的标签中显示金额以提供反馈。但是你想要的结果给人一种很好的感觉。您是否尝试将 ChangeListener
添加到您的滑块?每次滑块更改时都会调用它。因此,如果您在其中插入新位置和文本,它应该会正确更新。
//Slider has to be "final" for the listener.
final Slider slider = new Slider(0, 10, 1, true, skin);
slider.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
label.setY(slider.getValue() - min);
label.setText(slider.getValue());
}
});
这不需要在您的渲染方法中。它是一个侦听器,因此每当发生某些事情时,侦听器都会执行侦听器。
好的,所以我想出了一个变通办法。在更新文本时,标签似乎会移回其单元格对齐位置。为了解决这个问题,我只是将标签放在 table 中,两边各有一行,如下所示:
Table subTable = new Table();
subTable.add().row();
subTable.add(label).row();
subTable.add();
然后在渲染中我计算外部单元格的新高度值并应用它们:
float topH, botH;
// Calculate heights
topH = (1 - slider.getPercent()) * parentTable.getHeight();
botH = slider.getPercent() * parentTable.getHeight();
// Apply heights to exterior table cells
subTable.getCells().get(0).height(topH);
subTable.getCells().get(2).height(botH);
// Update label text
label.setText(slider.getValue());
这只是我所拥有的一个简单形式。您需要考虑标签高度以使其正确定位。此外,如果您希望它在滑块设置的 animateDuration 处跟随滑块,您需要使用 getVisualPercent() 而不是 getPercent()。然而,当您的手指飞出电池时,这会导致问题。出于某种原因,视觉百分比与手指离开单元格时滑块旋钮的位置相关联,而不是它结束的位置。
我的解决方法是将 animateDuration 设置为 0.0f 并使用 getPercent()。如果我或某人提出了 getVisualPercent() 选项的解决方案,那么发布也很好。
我想做的是添加一个标签以跟随滑块旋钮并显示旋钮的值。我目前有一个垂直滑块和一个堆叠在 table 单元格内的标签。我能够将标签定位到旋钮所在的位置并正确更新它的文本,但在移动旋钮时遇到问题。
当我移动旋钮时,只要我不更新文本,我就可以让标签跟随它。但是,如果我更新文本,那么标签会在单元格中重新居中,直到旋钮停止移动,此时它会将自己放在旋钮上。
如何使标签在更新文本时不会重新定位?
这是我正在进行的一些示例代码:
public class OptionsWindow implements Screen {
private Stage stage;
private Table table;
private Slider slider;
private Label label;
private Skin textSkin = new Skin(Gdx.files.internal("skins/skin.json"),
new TextureAtlas(Gdx.files.internal("skins/text.pack")));
private Skin sliderSkin = new Skin(Gdx.files.internal("skins/skin.json"),
new TextureAtlas(Gdx.files.internal("skins/text.pack")));
private min = 1, max = 2;
@Override
public void show() {
stage = new Stage();
table = new Table();
slider = new Slider(min, max, 0.001f, true, sliderSkin);
label = new Label(""), textSkin);
table.stack(label, slider).height(1000);
table.setFillParent(true);
stage.addActor(table);
Gdx.input.setInputProcessor(stage);
}
@Override
public void render() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
label.setY(slider.getValue() - min);
label.setText(slider.getValue());
stage.act();
stage.draw();
}
}
我为这个问题的答案做了很多搜索,但没有找到任何结果。我也试过将标签放在容器中并在更改标签文本的同时移动容器,但结果相同。我敢肯定以前有人这样做过。这似乎是人们想要的东西。拜托,欢迎任何帮助。
以前从未做过,我总是在滑块旁边或上方的标签中显示金额以提供反馈。但是你想要的结果给人一种很好的感觉。您是否尝试将 ChangeListener
添加到您的滑块?每次滑块更改时都会调用它。因此,如果您在其中插入新位置和文本,它应该会正确更新。
//Slider has to be "final" for the listener.
final Slider slider = new Slider(0, 10, 1, true, skin);
slider.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
label.setY(slider.getValue() - min);
label.setText(slider.getValue());
}
});
这不需要在您的渲染方法中。它是一个侦听器,因此每当发生某些事情时,侦听器都会执行侦听器。
好的,所以我想出了一个变通办法。在更新文本时,标签似乎会移回其单元格对齐位置。为了解决这个问题,我只是将标签放在 table 中,两边各有一行,如下所示:
Table subTable = new Table();
subTable.add().row();
subTable.add(label).row();
subTable.add();
然后在渲染中我计算外部单元格的新高度值并应用它们:
float topH, botH;
// Calculate heights
topH = (1 - slider.getPercent()) * parentTable.getHeight();
botH = slider.getPercent() * parentTable.getHeight();
// Apply heights to exterior table cells
subTable.getCells().get(0).height(topH);
subTable.getCells().get(2).height(botH);
// Update label text
label.setText(slider.getValue());
这只是我所拥有的一个简单形式。您需要考虑标签高度以使其正确定位。此外,如果您希望它在滑块设置的 animateDuration 处跟随滑块,您需要使用 getVisualPercent() 而不是 getPercent()。然而,当您的手指飞出电池时,这会导致问题。出于某种原因,视觉百分比与手指离开单元格时滑块旋钮的位置相关联,而不是它结束的位置。
我的解决方法是将 animateDuration 设置为 0.0f 并使用 getPercent()。如果我或某人提出了 getVisualPercent() 选项的解决方案,那么发布也很好。