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

测量要在画布上绘制的文本宽度(Android),android,text,android-canvas,draw,Android,Text,Android Canvas,Draw,是否有一种方法可以根据用于绘制文本的绘画,使用drawText()方法返回要在Android画布上绘制的文本的宽度(以像素为单位)?您看过吗?我使用了measureText()和getTextPath()+computeBounds()方法并构建一个Excel,其中包含可在下找到的固定大小字体的所有文本属性。 在这里,您还可以找到其他文本属性(如ascend等)的简单公式 此报告中还提供了用于生成excel中使用的原始值的函数。您可以使用“textPaint.getTextSize()”获取文本

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

您看过吗?

我使用了measureText()和getTextPath()+computeBounds()方法并构建一个Excel,其中包含可在下找到的固定大小字体的所有文本属性。 在这里,您还可以找到其他文本属性(如ascend等)的简单公式


此报告中还提供了用于生成excel中使用的原始值的函数。

您可以使用“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());

希望这能对你有所帮助。

补充答案

和返回的宽度之间存在细微差异
measureText
返回一个宽度,该宽度包括填充字符串开头和结尾的标志符号的advanceX值。由
getTextBounds
返回的
Rect
宽度没有此填充,因为边界是紧紧包裹文本的
Rect


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

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相等,并且具有其他人发布的高级宽度。有些人认为这个空间太大了。但是,这是非常主观的,取决于字体

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

但是,添加额外文本时,一个字母的边界看起来正常:


拍摄的图像,谢谢,就是这样!我不知道为什么我跳过了。其目的是简单地在屏幕中央绘制文本。无论如何,我刚刚意识到我也可以在用于绘制文本的画图上使用setTextAlign(Align.CENTER),它将指定的原点移动到绘制文本的中心。谢谢。太好了,谢谢,在油漆上设置对齐!谁会想到…?或者你可以将文本视图的重心设置为中心
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()