Androidで文字列の幅を取得する方法は?


回答:


201

getTextBounds(String text, int start, int end, Rect bounds)Paintオブジェクトのメソッドを使用できます。が提供するペイントオブジェクトを使用するかTextView、希望するテキストの外観で自分で作成することができます。

Textviewを使用すると、次のことができます。

Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.height();
int width = bounds.width();

5
@フランク:文字列がスパンされた文字列である場合はどうなりますか?
アシュウィン2015

すばらしい答えです。ところで、を呼び出すと、結果はより正確になりますtextView.setTextSize()
li2

81

あなただけの幅が必要な場合は、使用できます:

float width = paint.measureText(string);

http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)


4
さらに、特定のフォントサイズでテキストを測定する場合は、を使用できますTextPaint paint = new TextPaint(); paint.setTextSize(textSize);textSizeピクセル単位です。
Nathan Reline 2017

そして、身長を上げるために?
王子:

19

テキストには2つの異なる幅の測定があります。1つは幅に描画されたピクセルの数であり、もう1つはテキストの描画後にカーソルを進める必要のある「ピクセル」の数です。

paint.measureTextpaint.getTextWidthsは、指定された文字列を描画した後にカーソルを進めるピクセル数(浮動小数点数)を返します。ペイントされるピクセル数については、他の回答で述べたようにpaint.getTextBoundsを使用してください。これはフォントの「アドバンス」と呼ばれていると思います。

一部のフォントでは、これらの2つの測定値が(大きく)異なります。たとえば、フォントブラックチャンスリーは、他の文字を超えて(重複して)いる文字があります。大文字の「L」を参照してください。他の回答で述べたようにpaint.getTextBoundsを使用して、ピクセルをペイントします。


6

私はこの方法で幅を測定しました:

String str ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(20);
Typeface typeface = Typeface.createFromAsset(getAssets(), "Helvetica.ttf");
paint.setTypeface(typeface);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
Rect result = new Rect();
paint.getTextBounds(str, 0, str.length(), result);

Log.i("Text dimensions", "Width: "+result.width());

これはあなたを助けるでしょう。


3

ほとんどの場合、特定のフォントの特定のテキスト文字列(つまりTypeface、BOLD_ITALICスタイルの「sans-serif」フォントファミリーなどの特定のサイズ、およびspまたはpxでの特定のサイズ)のペイントされた寸法を知りたい場合があります。

本格的なを膨らませるのではなく、TextViewレベルを下げてPaintオブジェクトを直接操作して、1行のテキストを作成できます。次に例を示します。

// Maybe you want to construct a (possibly static) member for repeated computations
Paint paint = new Paint();

// You can load a font family from an asset, and then pick a specific style:
//Typeface plain = Typeface.createFromAsset(assetManager, pathToFont); 
//Typeface bold = Typeface.create(plain, Typeface.DEFAULT_BOLD);
// Or just reference a system font:
paint.setTypeface(Typeface.create("sans-serif",Typeface.BOLD));

// Don't forget to specify your target font size. You can load from a resource:
//float scaledSizeInPixels = context.getResources().getDimensionPixelSize(R.dimen.mediumFontSize);
// Or just compute it fully in code:
int spSize = 18;
float scaledSizeInPixels = TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP,
            spSize,
            context.getResources().getDisplayMetrics());
paint.setTextSize(scaledSizeInPixels);

// Now compute!
Rect bounds = new Rect();
String myString = "Some string to measure";
paint.getTextBounds(myString, 0, myString.length(), bounds);
Log.d(TAG, "width: " + bounds.width() + " height: " + bounds.height());



以下のために複数行またはスパンテキストSpannedString)、使用することを検討してStaticLayoutいるあなたが幅を提供し、高さを引き出します、。それを行うカスタムビューでテキストを測定してキャンバスに描画することについての非常に手の込んだ答えについては、https//stackoverflow.com/a/41779935/954643を参照してください。

これに対処する必要がある場合に備えて、ペイントされたピクセルと有効幅(「指定された文字列を描画した後にカーソルを進める必要があるピクセル数(浮動小数点数)」)について、@ arbergの以下の返答にも注目してください。


2

静的クラスを使用して描画されたテキスト()の正確な幅を取得するより良い方法(現在受け入れられている回答よりも用途が広い)を共有したいと思います。StringStaticLayout

StaticLayout.getDesiredWidth(text, textPaint))

この方法はtextView.getTextBounds()、マルチラインで単一ラインの幅を計算できるためTextView、またはTextView(たとえば、カスタムView実装で)を最初から使用しない可能性があるため、より正確です。

この方法はに似ていtextPaint.measureText(text)ますが、まれに正確になる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.