Как получить ширину строки в Libgdx?

Интересно, знаю, как получить ширину моей строки в пикселях

3 ответа

Решение

API BitmapFont < 1.5.6

Чтобы измерить ширину String вы используете свой Font и получить bounds из Stringсобираешься рисовать.

BitmapFont.getBounds(String str).width

API BitmapFont

Вы также можете получить высоту для правого смещения для рисования. Просто замените ширину на высоту.

Кроме того, для многострочных текстов используйте getMultiLineBounds(someString).width чтобы получить границы.


BitmapFont API> = 1.5.6

API-интерфейс BitmapFont был изменен в 1.5.7, поэтому теперь есть другой способ получить границы:

BitmapFont.TextBounds и getBounds готовы. Вместо этого передайте строку в GlyphLayout и получите границы, используя поля ширины и высоты. Затем вы можете нарисовать текст, передав тот же GlyphLayout в BitmapFont, что означает, что глифы не нужно размещать дважды, как раньше.

Источник

Пример:

GlyphLayout layout = new GlyphLayout(); //dont do this every frame! Store it as member
layout.setText("meow");
float width = layout.width;// contains the width of the current set text
float height = layout.height; // contains the height of the current set text

Согласно ответу @Nates: /questions/20808284/libgdx-getbounds-ne-vozvraschaet-pravilnuyu-shirinu/20808291#20808291 вызывающий метод

BitmapFont.getBounds(String str).width

не всегда возвращает правильную ширину! Особенно, когда вы повторно используете шрифт. Если вы хотите нарисовать текст, например in the center of part of view port, вы можете избежать этой проблемы, используя другой метод

BitmapFont.drawWrapped(...)

Пример кода:

 font.drawWrapped(spriteBatch, "text", x_pos, y_pos, your_area_for_text, BitmapFont.HAlignment.CENTER);

Если вы используете скины в пользовательском интерфейсе, вам будет сложно найти правильный шрифт для подачи в GlyphLayout.

В этом случае я использую выбрасываемый экземпляр Label, чтобы выяснить все для меня, а затем спрашиваю Label о ширине.

Skin skin = getMySkin();
Label cellExample = new Label("888.88888", skin);
cellExample.layout();
float cellWidth = cellExample.getWidth();

Table table = new Table(skin);
table.defaults().width(cellWidth);
// fill table width cells ...

Это не ответ, если вы хотите расположить текст самостоятельно, но полезно сделать макет пользовательского интерфейса стабильным и менее зависимым от фактического содержимого ячеек.

Другие вопросы по тегам