测量要在 Canvas 上绘制的文本宽度(Android)

有没有一种方法可以返回要在 Android 画布上绘制的文本的宽度(以像素为单位) ,使用 draText ()方法根据用于绘制文本的 Paint 进行绘制?

84406 次浏览
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();

我使用的方法是 testureText ()和 getTextPath () + computeBounds () ,并构建了一个 Excel,其中包含在 https://github.com/ArminJo/android-blue-display/blob/master/TextWidth.xlsx下可以找到的固定大小字体的所有文本属性。 在那里你还可以找到其他文本属性的简单公式,比如 ascend 等等。

应用程序以及用于生成 excel 中使用的原始值的函数 DrawFontTest ()也可以在本回购中使用。

您可以使用“ textPaint.getTextSize ()”来获取文本宽度

我以不同的方式做到了:

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

希望这个能帮到你。

补充答案

Paint.measureTextPaint.getTextBounds返回的宽度略有不同。measureText返回一个宽度,该宽度包括字符的 AdvanceX 值填充字符串的开始和结束。getTextBounds返回的 Rect宽度没有这种填充,因为边界是紧密包装文本的 Rect

来源

实际上有三种不同的测量文本的方法。

获取文本界限:

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

措施文字宽度:

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 可能会很有用。

MemureTextWidth 和 getTextWidth 是相等的,并且具有其他人发布的度量值的高级宽度。有些人认为这个空间太大了。然而,这是非常主观的,并取决于字体。

例如,度量文本边界的宽度实际上可能看起来太小:

measure text bounds looks small

然而,当添加一个额外的文本时,一个字母的界限看起来是正常的: measure text bounds looks normal for strings

图片来自 Android 开发者自定义画布绘图指南