Canvas(Android)に描画されるテキスト幅の測定


129

描画に使用されたPaintに従って、drawText()メソッドを使用してAndroidキャンバスに描画されるテキストの幅(ピクセル単位)を返すメソッドはありますか?

回答:


224

20
ありがとうございます。スキップした理由がわかりません。目的は、単に画面の中央にテキストを描くことでした。とにかく、テキストの描画に使用されるPaintでsetTextAlign(Align.CENTER)を使用することもできることに気づき、指定された原点を描画されたテキストの中心に移動しました。ありがとう。
NioX5199

2
ありがとうございます。ペイントにAlignを設定します。誰がそのことを考えたでしょう...?
Sanjay Manohar、2011

または、テキストビューの重力をセンターに設定できます
yeradis

32
Paint paint = new Paint();
Rect bounds = new Rect();

int text_height = 0;
int text_width = 0;

paint.setTypeface(Typeface.DEFAULT);// your preference here
paint.setTextSize(25);// have this the same as your text size

String text = "Some random text";

paint.getTextBounds(text, 0, text.length(), bounds);

text_height =  bounds.height();
text_width =  bounds.width();

12

補足回答

Paint.measureTextとによって返される幅にはわずかな違いが ありPaint.getTextBoundsます。measureText文字列の最初と最後を埋めるグリフのadvanceX値を含む幅を返します。Rectで返される幅はgetTextBounds限界があるため、このパディングを持っていないRectしっかりとテキストをラップしています。

ソース


2

テキストを測定するには、実際には3つの異なる方法があります。

GetTextBounds:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
paint.getTextBounds(contents, 0, 1, rect)
val width = rect.width()

MeasureTextWidth:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val width = paint.measureText(contents, 0, 1)

そしてgetTextWidths:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
val arry = FloatArray(contents.length)
paint.getTextBounds(contents, 0, contents.length, rect)
paint.getTextWidths(contents, 0, contents.length, arry)
val width = ary.sum()

getTextWidthsは、テキストを次の行に折り返すタイミングを決定する場合に役立ちます。

measureTextWidthとgetTextWidthは等しく、他の人が投稿したことを測定する高度な幅があります。このスペースが過剰であると考える人もいます。ただし、これは非常に主観的であり、フォントに依存します。

たとえば、メジャーテキストの境界からの幅は実際には小さすぎるように見える場合があります。

テキスト境界を測定すると小さく見える

ただし、テキストを追加すると、1文字の境界は正常に見えます。 文字列のテキスト境界を測定すると正常に見える

Android開発者ガイドからカスタムキャンバス描画に取得した画像


1

さて、私は別の方法で行いました:

String finalVal ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(40);
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(finalVal, 0, finalVal.length(), result);

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

これがお役に立てば幸いです。


0

私は、メソッドのmeasureText()およびgetTextPath()+ computeBoundsを(使用)と、すべてのテキストが下にあります固定サイズのフォント属性を使用してExcelを構築https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx。そこでは、アセンドなどの他のテキスト属性の簡単な数式も見つかります。

アプリならびに機能drawFontTest() Excelで使用される生の値を生成するが、このリポジトリでも利用可能です。


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