web-dev-qa-db-ja.com

Libgdxで文字列の幅を取得するにはどうすればよいですか?

文字列のwidthをピクセルで取得する方法を知りたい

23
LeSam

BitmapFont API <1.5.6

Stringの幅を測定するには、Fontを使用してboundsStringを取得し、描画します。

_BitmapFont.getBounds(String str).width
_

BitmapFont API

描画のための適切なオフセットの高さも取得できます。幅を高さに置き換えるだけです。

さらに、複数行のテキストの場合は、getMultiLineBounds(someString).widthを使用して境界を取得します。


BitmapFont API> = 1.5.6

BitmapFont APIは1.5.7で変更されたため、境界を取得する別の方法があります。

BitmapFont.TextBoundsとgetBoundsが実行されます。代わりに、文字列をGlyphLayoutに渡し、その幅と高さフィールドを使用して境界を取得します。次に、同じGlyphLayoutをBitmapFontに渡すことでテキストを描画できます。これは、グリフを以前のように2回レイアウトする必要がないことを意味します。

ソース

例:

_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
_
65
BennX

@ネイツの回答によると: https://stackoverflow.com/a/20759876/61967 呼び出しメソッド

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);
5
deadfish

UIでスキンを使用する場合、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 ...

テキストを自分で配置したい場合、これは答えではありませんが、UIレイアウトを安定させ、セルの実際のコンテンツにあまり依存しないようにするのに役立ちます。

0