web-dev-qa-db-ja.com

キャンバスに描画するテキストの幅を測定する(Android)

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

120
NioX5199
209
Marc Bernstein
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();
29

補足回答

Paint.measureTextPaint.getTextBounds によって返される幅にはわずかな違いがあります。 measureTextは、文字列の先頭と末尾を埋めるグリフのadvanceX値を含む幅を返します。 Rectによって返されるgetTextBounds幅には、境界がテキストを厳密にラップするRectであるため、このパディングがありません。

source

8
Suragch

まあ私は別の方法でやった:

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());

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

1
Hiren Patel

テキストを測定する方法には、実際には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は等しく、他の人が投稿したものを測定する高度な幅を持っています。このスペースが過剰であると考える人もいます。ただし、これは非常に主観的であり、フォントに依存します。

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

measure text bounds looks small

ただし、追加のテキストを追加すると、1文字の境界は正常に見えます。 measure text bounds looks normal for strings

Android Developers Guide to Custom Canvas Drawing( から撮影した画像

0
Jim Baca

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

このレポでは、Excelで使用される生の値を生成するための app および関数 drawFontTest() も使用できます。

0
Armin J.