根据您的需要,有不同的方法来测量高度。
如果您正在执行诸如将少量固定文本精确居中的操作,您可能需要getTextBounds。你可以像这样得到边界矩形
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
如下图所示,不同的字符串会给出不同的高度(以红色显示)。
这些不同的高度在某些情况下可能是不利的,因为无论文本是什么,您都只需要一个恒定的高度。请参阅下一节。
您可以根据字体指标计算字体的高度。高度总是相同的,因为它是从字体中获得的,而不是任何特定的文本字符串。
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
基线是文本所在的行。下降通常是角色将在该线之下的最远距离,而上升通常是角色将在该线之上的最远距离。要获得高度,您必须减去 ascent,因为它是负值。 (基线是y=0 和y 缩小屏幕。)
看下图。两个字符串的高度均为234.375。
如果您想要行高而不仅仅是文本高度,您可以执行以下操作:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
这些是该行的bottom 和top。前导(行间距)通常为零,但无论如何您都应该添加它。
以上图片来自this project。您可以使用它来了解字体指标是如何工作的。
要测量多行文本的高度,您应该使用StaticLayout。我在this answer里讲的比较详细,但是得到这个高度的基本方法是这样的:
String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setAntiAlias(true);
myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
myTextPaint.setColor(0xFF000000);
int width = 200;
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();