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() 选项的解决方案,那么发布也很好。