如何根据设备宽度和字体大小测量TextView的高度?

23
我正在寻找一种在Android中的方法,它将接受输入(文本、文本字体大小、设备宽度),并基于这些计算返回需要显示特定文本所需的高度。
我根据内容在运行时设置文本视图/ WebView的高度,我知道wrap_content的用法,但由于某些WebView的最小高度问题,我无法在我的情况下使用它。
因此,我尝试计算高度并基于此设置视图高度。
我已经尝试了以下方式:
Paint paint = new Paint();
paint.setTextSize(text.length()); 
Rect bounds = new Rect();
paint.getTextBounds(text, 0, 1, bounds);
mTextViewHeight= bounds.height();

输出结果如下:

1)对于字体大小15,“Hello World”返回高度为13。

2)“Jelly Bean的最新版本已经发布,带来了性能优化”,对于字体大小15,返回高度为16。

接着我尝试了以下内容:

Paint paint = new Paint();
paint.setTextSize(15);
paint.setTypeface(Typeface.SANS_SERIF);
paint.setColor(Color.BLACK);

Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), result);

Paint.FontMetrics metrics = brush.getFontMetrics();
int totalHeight = (int) (metrics.descent - metrics.ascent + metrics.leading);

所以输出结果是

1)“Hello World”对于字体大小为15,返回高度为17

2)“Jelly Bean的最新版本已经发布,性能得到优化”对于字体大小为15,返回高度为17

如果我将这些值设置为我的视图,则其会截断一些文本,不能显示全部内容。

在某些表格上看起来没问题,因为它们具有很大的宽度,但在手机上不行。

是否有一种基于内容计算高度的方法?

3个回答

55
public static int getHeight(Context context, String text, int textSize, int deviceWidth) {
    TextView textView = new TextView(context);
    textView.setText(text);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
    int widthMeasureSpec = MeasureSpec.makeMeasureSpec(deviceWidth, MeasureSpec.AT_MOST);
    int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    textView.measure(widthMeasureSpec, heightMeasureSpec);
    return textView.getMeasuredHeight();
}
如果textSize的单位不是像素,则需要更改setTextSize()的第一个参数。

文本大小基本上是什么? - Habib Ali

11

我有一种更简便的方法来确定线条被绘制前的真实高度,不知道这是否对你们有帮助,但我的解决方案可以独立于布局的高度获取线条的高度,只需像这样获取字体度量:

myTextView.getPaint().getFontMetrics().bottom - myTextView.getPaint().getFontMetrics().top)

通过这样做,我们可以得到字体在TextView中实际占用的高度。这不会给你一个整数,但是你可以使用Math.round来获得一个接近的值。


1
final int newHeight = myTextView.getLineCount() * (int) (myTextView.getPaint().getFontMetrics().bottom - myTextView.getPaint().getFontMetrics().top);最终高度等于文本视图的行数乘以字体高度,即底部到顶部的距离。 - PanCrucian
1
很棒的答案。注意:您还可以直接使用myTextView.getPaint().getFontMetricsInt()获取一个int。 - David Ferrand

9
< p > Paint.getTextBounds() 的返回结果与您的预期不同。详情请参见此处

相反,您可以尝试以下方法:

int mMeasuredHeight = (new StaticLayout(mMeasuredText, mPaint, targetWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true)).getHeight();

谢谢。这是在绘制文本时重新组装原生TextView高度应该使用的内容。 - Roman Minenok
自定义字体怎么样? - webrama.pl
你可以将自定义字体添加到mPaint中。 - David Vittori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接