libgdx scene2d возвращает неправильную высоту метки
Я хочу расположить три текстовые метки в точной конкретной точке на экране (в данном случае сверху, чтобы проиллюстрировать проблему проще). Так что я:
LabelStyle labelStyle = new LabelStyle(new BitmapFont(), new Color(1,1,1,1));
Label textFullSize = new Label("Line 1 of 4\nLine 2 of 4\nLine 3 of 4\nLine 4 of 4", labelStyle);
textFullSize.setFontScale(1);
textFullSize.setPosition(0, Gdx.graphics.getHeight()-textFullSize.getPrefHeight());
stage.addActor(textFullSize);
Label textHalfSize = new Label("Line small 1 of 4\nLine small 2 of 4\nLine small 3 of 4\nLine small 4 of 4", labelStyle);
textHalfSize.setFontScale(0.5f);
textHalfSize.setPosition(Gdx.graphics.getWidth()*0.15f, Gdx.graphics.getHeight()-textHalfSize.getPrefHeight());
stage.addActor(textHalfSize);
Label textDoubleSize = new Label("Line large 1 of 4\nLine large 2 of 4\nLine large 3 of 4\nLine large 4 of 4", labelStyle);
textDoubleSize.setFontScale(2);
textDoubleSize.setPosition(Gdx.graphics.getWidth()*0.25f, Gdx.graphics.getHeight()-textDoubleSize.getPrefHeight());
stage.addActor(textDoubleSize);
Но вот что я получаю:
Почему это происходит? Почему getPrefHeight() не может вернуть правильную высоту метки? Как я могу разместить этикетки без этого?
1 ответ
Когда вы изменяете масштаб метки, ее новый размер не вызывается автоматически до stage.act()
называется. Это сделано для того, чтобы не тратить много времени на пересчет размера всего, если вы сделаете несколько изменений, которые повлияют на размер.
Но вы можете заставить его обновить свой размер, вызвав layout()
на этикетке. Тогда вы получите правильное значение, когда вы звоните getPrefHeight()
, Например:
Label textHalfSize = new Label("Line small 1 of 4\nLine small 2 of 4\nLine small 3 of 4\nLine small 4 of 4", labelStyle);
textHalfSize.setFontScale(0.5f);
textHalfSize.layout();
textHalfSize.setPosition(Gdx.graphics.getWidth()*0.15f, Gdx.graphics.getHeight()-textHalfSize.getPrefHeight());
stage.addActor(textHalfSize);
В общем, это не расточительно, потому что он будет внутренне помечать свой макет как обновленный, поэтому в большинстве случаев ему не придется пересчитывать этот материал в stage.act()
,