LibGdx Label文本换行错误?

时间:2017-04-25 18:46:05

标签: java libgdx

我使用启用了文本换行的Label。在这种情况下,文本包装错误。文本包装成3行,当它应该只有2行时,Label大小只反映2行。我通过代码进行了调试,发现其原因在于Label.layout()方法。不确定这是一个错误还是我做错了什么。

在下面的代码中,您可以看到文本被设置为GlyphLayout两次。它第一次包装正确,第二次我们使用减小的宽度,它像以前一样包裹成更多的线条。我认为第二次将文本设置为GlyphLayout时,应使用相同的宽度。

public class Label extends Widget {

   public void layout () {
      ...

      float width = getWidth(), height = getHeight();
      ...

      GlyphLayout layout = this.layout;
      float textWidth, textHeight;
      if (wrap || text.indexOf("\n") != -1) {
         // Set the text into the GlyphLayout. The text is wrapped correctly here
         layout.setText(font, text, 0, text.length, Color.WHITE, width, lineAlign, wrap, ellipsis);
         textWidth = layout.width;
         textHeight = layout.height;

         ...
      } else {
         textWidth = width;
         textHeight = font.getData().capHeight;
      }

      ...

      // Set the text again into the GlyphLayout. This time with the width that we got when we set it the first time
      // This time the text is wrapped wrong as it uses less width as it should
      layout.setText(font, text, 0, text.length, Color.WHITE, textWidth, lineAlign, wrap, ellipsis);
      ...
   }
}

感谢您检查 西蒙

2 个答案:

答案 0 :(得分:0)

确保invalidate()标签,然后pack()标签,以便计算任何新的首选尺寸;这可能会也可能不会解决问题。

查看Label的源代码,您可以看到无论文本环绕与否,始终都会调用layout.setText()的最后一次调用。

之前的layout.setText()调用用于为后来的调用设置textWidthtextHeight,以便实际使用这些值。

如果打开包装或有换行符,则宽度和高度设置为标签的宽度和高度,如果关闭,则宽度设置为实际文本宽度,高度设置为字体数据高度。

从上面可能导致这种情况发生的另一个问题是,如果您缩放了字体和/或标签。未在Label.layout()范围内应用缩放因子,这可能导致标签大小为2行,而实际文本为3行,因为宽度不允许包装设置为打开时溢出。

如果所有其他方法都失败了,我会确保您的字体文件正确无误,并且文本中没有任何可能导致新行发生的字符或数据。

我还建议使用相同字形宽度和高度的另一种字体,看看问题是否仍然存在。如果没有,那么至少你知道这是与字体有关的问题而不是标签。

希望这有助于你。

答案 1 :(得分:0)

此问题已在 libgdx 1.9.12 中解决