2014-12-18 54 views
2

我想将三个文本标签放置在屏幕上的一个确切点上(在这种情况下,在顶部可以更容易地说明问题)。所以,我有: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); 

但这里是我得到: wrong label positioning

这究竟是为什么?为什么不能getPrefHeight()返回标签的正确高度?如何在没有这些的情况下定位标签?

回答

0

当您更改标签的比例尺时,不会自动调用其新尺寸,直到调用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()重新计算这些东西。

+0

这没有效果。 'getPrefHeight()'在调用'layout()'之前和之后返回相同(不正确)的值。 – TimSim 2014-12-21 08:58:19