Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Libgdx Label multiline text height

i have done a small test on LibGdx, on Multi-line Label, it seems that i cant get the wrapped line's height. Following is the code. Theoretically, height for aLebel should be > bLabel. But the result appear the same.

code:

aLabel.setText("this is a super long long long text that need wrapping."); // line wrapped into 3 lines
aLabel.setWrap(true);
aLabel.setWidth(470);
doLog("aLabel.getHeight(): " + aLabel.getHeight());

bLabel.setText("this is short."); // unwrapped line
bLabel.setWrap(true);
bLabel.setWidth(470);
doLog("bLabel.getHeight(): " + bLabel.getHeight());

result:

aLabel.getHeight(): 45.0
bLabel.getHeight(): 45.0

Do anyone have any idea how to get the actual multi-line height in LibGdx? Thanks in advance.

like image 821
Ziiiii Avatar asked Jun 18 '14 02:06

Ziiiii


4 Answers

I had this issue for years and accidentally solved it by setting the width and packing the label twice. Note that multiline labels were never intended to figure out their own width, so you have to set them externally, preferably from it's parent.

public Label createLabel() {
    // Create label and set wrap
    Label label = new Label("Some long string here...", skin);
    label.setWrap(true);

    // Pack label
    label.pack(); // This might not be necessary, unless you're changing other attributes such as font scale.

    // Manual sizing
    label.setWidth(textWidth); // Set the width directly
    label.pack(); // Label calculates it's height here, but resets width to 0 (bug?)
    label.setWidth(textWidth); // Set width again

    return label;
}

LibGDX version used: 1.6.4

like image 134
RafaSKB Avatar answered Oct 31 '22 18:10

RafaSKB


Pack sizes the widget to its pref size, nothing more. Pref width of a label with wrapping is 0.

Label label = new Label(...);
label.setWrap(true);
label.setWidth(123);
label.setHeight(label.getPrefHeight());
like image 20
NateS Avatar answered Oct 31 '22 16:10

NateS


I had the same issue and it seems there doesn't exist a method in Label class to solve this. Also, I agree with you, the getHeight() method should return the real height of the Actor, so I don't know if that's a bug or there is a reasoning behind that behaviour.

Anyways, how I solved the issue is by using BitmapFont's getWrappedBounds method. It's not short, but for your example it would be the following:

doLog("aLabel.getHeight(): " + aLabel.getStyle().font.getWrappedBounds(aLabel.getText(), aLabel.getWidth()).height);
like image 26
Noel De Martin Avatar answered Oct 31 '22 18:10

Noel De Martin


This could be done by adding a restriction to the cell that contains the Label in the Table:

Label label = new Label("Example", new Label.LabelStyle(font, Color.WHITE));
label.setWrap(true);

Table table = new Table();
table.add(label).width(WITH);

For more information about how to use Table go to: https://github.com/libgdx/libgdx/wiki/Table

like image 27
Camilo Ortegón Avatar answered Oct 31 '22 16:10

Camilo Ortegón