Как измерить высоту 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
если я установил эти значения для своего представления, а затем отрезал какой-то текст, не показывая весь контент.
Снова он выглядит нормально на некоторых таблицах, поскольку он имеет большую ширину, но не на телефоне.
Есть ли способ вычислить высоту по содержанию?
Ответы
Ответ 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, чтобы получить почти значение.