なるべく高さも取得したいです。
なるべく高さも取得したいです。
回答:
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();
textView.setTextSize()
。
あなただけの幅が必要な場合は、使用できます:
float width = paint.measureText(string);
http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)
TextPaint paint = new TextPaint(); paint.setTextSize(textSize);
。textSize
ピクセル単位です。
テキストには2つの異なる幅の測定があります。1つは幅に描画されたピクセルの数であり、もう1つはテキストの描画後にカーソルを進める必要のある「ピクセル」の数です。
paint.measureTextとpaint.getTextWidthsは、指定された文字列を描画した後にカーソルを進めるピクセル数(浮動小数点数)を返します。ペイントされるピクセル数については、他の回答で述べたようにpaint.getTextBoundsを使用してください。これはフォントの「アドバンス」と呼ばれていると思います。
一部のフォントでは、これらの2つの測定値が(大きく)異なります。たとえば、フォントブラックチャンスリーは、他の文字を超えて(重複して)いる文字があります。大文字の「L」を参照してください。他の回答で述べたようにpaint.getTextBoundsを使用して、ピクセルをペイントします。
私はこの方法で幅を測定しました:
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());
これはあなたを助けるでしょう。
ほとんどの場合、特定のフォントの特定のテキスト文字列(つまり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の以下の返答にも注目してください。
静的クラスを使用して描画されたテキスト()の正確な幅を取得するより良い方法(現在受け入れられている回答よりも用途が広い)を共有したいと思います。String
StaticLayout
StaticLayout.getDesiredWidth(text, textPaint))
この方法はtextView.getTextBounds()
、マルチラインで単一ラインの幅を計算できるためTextView
、またはTextView
(たとえば、カスタムView
実装で)を最初から使用しない可能性があるため、より正確です。
この方法はに似ていtextPaint.measureText(text)
ますが、まれに正確になる場合があります。