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


129

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

Answers:


224

20
谢谢,就是这样!我不知道为什么我跳过了它。目的只是在屏幕中央绘制一个文本。无论如何,我刚刚意识到也可以在用于绘制文本的Paint上使用setTextAlign(Align.CENTER),它将指定的原点移动到绘制文本的中心。谢谢。
NioX5199 2010年

2
太好了,谢谢,在“ Paint”上设置“ Align”!谁会想到的...?
Sanjay Manohar

或者您可以将textview的Gravity设置为Center
yeradis'Oct21

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.getTextBoundsmeasureText返回一个宽度,该宽度包括字形的advanceX值,该值在字符串的开头和结尾进行填充。Rect返回的宽度getTextBounds没有此填充,因为边界是Rect紧密包裹文本的边界。

资源


2

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

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

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

测量文本边界看起来很小

但是,添加其他文本时,一个字母的边界看起来很正常: 测量字符串的文本边界看起来很正常

图片取自《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());

希望这会帮助你。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.