22

我正在寻找在 Android 中接受输入(文本、text_font_size、device_width)的方法,并根据这些计算返回显示特定文本所需的高度?

我正在根据他的内容设置文本视图/网络视图高度运行时,我知道扭曲内容,但由于一些网络视图最小高度问题,我无法在我的情况下使用。

所以我正在尝试计算高度并基于此设置视图高度。

我尝试过以下方法

Paint paint = new Paint();
paint.setTextSize(text.length()); 
Rect bounds = new Rect();
paint.getTextBounds(text, 0, 1, bounds);
mTextViewHeight= bounds.height();

所以输出是

1) "Hello World" 为字体 15 返回高度 13

2)“最新版本的果冻豆在这里,性能优化”为字体 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)“最新版本的果冻豆在这里,性能优化”为字体 15 返回高度 17

如果我将这些值设置为我的视图,那么它会剪切一些文本,它不会显示所有内容。

同样,它在某些桌子上看起来还不错,因为它的宽度很大,但在电话上却不行。

有没有办法根据内容计算高度?

4

3 回答 3

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

于 2013-01-11T13:09:09.410 回答
10

我有一个更简单的方法可以在绘制之前知道一条线的真实高度,我不知道这是否对你们有帮助,但是我获得一条线高度的解决方案与布局的高度无关,只是采用这样的字体指标:

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

这样我们就得到了字体将从要绘制的文本视图中获取的真实高度。这不会给你一个 int,但你可以做一个 Math.round 来获得一个接近的值。

于 2016-10-19T13:48:21.000 回答
9

Paint.getTextBounds()返回不是您所期望的。详情在这里

相反,您可以尝试这种方式:

int mMeasuredHeight = (new StaticLayout(mMeasuredText, mPaint, targetWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true)).getHeight();
于 2013-03-13T13:16:42.517 回答