Libgdx:是否有一种简单的方法来使文本在按钮的每个轴上居中?

20

我一直在尝试找到一种将文本居中显示在按钮上的方法,但是找不到一个简单且通用的方法。我可以做到这一点,但只适用于特定的字符串,而不是任何字符串。我想知道是否有一种方法可以将任何字符串居中显示在按钮上。 在这种情况下,我的按钮尺寸为185x50。

我已经成功将该按钮居中显示在屏幕上,就像这样:

buttonX = WIDTH / 2 - (screen.getRegionWidth() / 2);
buttonY = HEIGHT / 2 - (screen.getRegionHeight() / 2);

非常感谢任何帮助。 :)


你正在使用libGDX舞台UI中的“button”吗?还是你自己的按钮类? - P.T.
3个回答

61

更新了答案以适配 libgdx 版本 1.7.1-SNAPSHOT:

最简单的方法是使用 libgdx 中的 TextButton 类。TextButton 的文本默认居中对齐。这个方法仍然有效!

更新后的示例:

final BitmapFont font = new BitmapFont();

final String text = "Test";

final GlyphLayout layout = new GlyphLayout(font, text);
// or for non final texts: layout.setText(font, text);

final float fontX = objectX + (objectWidth - layout.width) / 2;
final float fontY = objectY + (objectHeight + layout.height) / 2;

font.draw(batch, layout, fontX, fontY);

过时的示例:

这不再起作用了!

如果您不想使用它,您可以使用以下代码获取字体的宽度和高度:

    font.getBounds("Test text");

所以你可以像这样做:

    String fontText = "";
    fontX = buttonX + buttonWidth/2 - font.getBounds(fontText).width/2;
    fontY = buttonY + buttonHeight/2 + font.getBounds(fontText).height/2;

2
仅作为对此答案的补充,您可以通过从游戏宽度中减去文本的宽度并除以2来轻松居中。 fontX =(gameWidth - font.getBounds(fontText).width)/ 2 - Willem Ellis
我认为他们更改了它,因为我在API中找不到它。 - Alex K
1
@AlexKapustian,你可以在libgdx的新版本中使用glyphlayout来实现这个目的。 - bytestorm
为什么要担心任意居中文本的问题呢?直接使用TextButton即可,它会自动将文本居中。 - Malkierian

15

对于较新版本的libgdx,函数BitMapFont.getBounds()在api中不再存在。您可以使用GlyphLayout来获取边界。例如,

BitmapFont font;
SpriteBatch spriteBatch;
//... Load any font of your choice first
FreeTypeFontGenerator fontGenerator = new FreeTypeFontGenerator(
   Gdx.files.internal("myFont.ttf")
);
FreeTypeFontGenerator.FreeTypeFontParameter freeTypeFontParameter =
      new FreeTypeFontGenerator.FreeTypeFontParameter();
freeTypeFontParameter.size = size;
fontGenerator.generateData(freeTypeFontParameter);
font = fontGenerator.generateFont(freeTypeFontParameter);

//Initialize the spriteBatch as requirement

GlyphLayout glyphLayout = new GlyphLayout();
String item = "Example";
glyphLayout.setText(font,item);
float w = glyphLayout.width;
font.draw(spriteBatch, glyphLayout, (Game.SCREEN_WIDTH - w)/2, y);

Pinkie Swirl所提到的TextButton如果不使用stage是行不通的。很高兴看到使用了setText而不是不必要的实例化。 - John

-1

请尝试以下方法:

label.setPosition(Gdx.graphics.getWidth()/2-(label.getPrefWidth()/2),Gdx.graphics.getHeight()-(label.getPrefHeight()/2));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接