Подтвердить что ты не робот

Как измерить высоту TextView на основе ширины и размера шрифта устройства?

Я ищу метод в Android, который будет принимать входные данные (text, text_font_size, device_width), и на основе этих вычислений он вернет, сколько высоты потребуется для отображения определенного текста?

Я устанавливаю время просмотра текстового представления/веб-просмотра на основе его содержимого, я знаю о содержимом warp, но я не могу использовать его в моем случае из-за некоторой проблемы с минимальной высотой веб-представления.

Итак, я пытаюсь рассчитать высоту и на основании этого устанавливаю высоту представления.

Я пробовал следующие способы:

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

Таким образом, вывод

1) "Hello World" возвращает высоту 13 для шрифта 15

2) "Последняя версия Jelly Bean здесь, с оптимизацией производительности" возвращает высоту 16 для шрифта 15

Затем я попытался с

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" возвращает высоту 17 для шрифта 15

2) "Последняя версия Jelly Bean здесь, с оптимизацией производительности" возвращает высоту 17 для шрифта 15

если я установил эти значения для своего представления, а затем отрезал какой-то текст, не показывая весь контент.

Снова он выглядит нормально на некоторых таблицах, поскольку он имеет большую ширину, но не на телефоне.

Есть ли способ вычислить высоту по содержанию?

4b9b3361

Ответ 1

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

Ответ 2

Paint.getTextBounds() возвращает не то, что вы ожидаете. Подробности здесь.

Вместо этого вы можете попробовать следующим образом:

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

Ответ 3

У меня есть более простой способ узнать реальную высоту строки перед тем, как ее нарисовать, я не знаю, поможет ли это вам, ребята, но мое решение, чтобы получить высоту линии, независимо от высоты макет, просто возьмите такие метрики шрифта, как это:

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

с тем, что мы получим реальную высоту, которую будут использовать шрифты из текстового поля для рисования. Это не дает вам int, но вы можете сделать Math.round, чтобы получить почти значение.