libgdx同时更新标签文本和位置

时间:2015-07-26 21:07:33

标签: java android libgdx slider label

我要做的是添加一个标签以跟随滑块旋钮并显示旋钮的值。我目前有一个垂直滑块和一个堆叠在表格单元格内的标签。我能够将标签定位到旋钮的位置并正确更新文本,但在移动旋钮时出现问题。

当我移动旋钮时,只要不更新文本,我就可以使标签跟随它。但是,如果我更新文本,那么标签会重新集中在单元格中,直到旋钮停止移动,此时它将自己置于旋钮上。

如何制作标签,以便在更新文字时不重新定位标签?

以下是我正在进行的一些示例代码:

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();
    }
}

我已经做了很多寻找这个问题的答案,但没有得到任何结果。我还尝试将标签放在容器中并在更改标签文本时移动容器,但同样的结果也会发生。我确定之前有人做过这件事。这似乎是人们想要的东西。欢迎任何帮助。

2 个答案:

答案 0 :(得分:0)

以前从未这样做过,我总是在滑块旁边或上方的标签中显示金额以提供反馈。但是你所追求的结果给人一种很好的感觉。您是否尝试在滑块上添加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());
            }
        });

这不需要在您的渲染方法中。它是一个监听器,所以只要有事情发生,监听器就会监听它。

答案 1 :(得分:0)

好的,所以我想出了一个解决方法。在更新文本时,标签似乎会移回其单元格对齐位置。要解决这个问题,我只需将我的标签放在一个表格中,每一行都有一行,如下所示:

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