Получить размер текста в TextView
У меня проблема с размещением textView в заданных координатах центра x и y.
Во-первых, я попытался установить текст в textView и переместить вид с шириной и высотой представления
из этой ссылки.
Но это не работает, и я хотел бы попробовать что-то еще.
Я хотел бы узнать, есть ли способ получить размер, который будет указан в моем текстовом элементе?
Я имею в виду, я знаю текст и textSize, как я могу получить ширину и высоту моего textView?
Что-то вроде метода (NSString)sizeWithFont;
для тех, кто знает iPhone dev.
Ответы
Ответ 1
Если ваше текстовое название называется TV
TV.setText("bla");
TV.measure(0, 0); //must call measure!
TV.getMeasuredHeight(); //get height
TV.getMeasuredWidth(); //get width
Подробнее об этом (обновлено): Как получить ширину/высоту представления
Ответ 2
Rect bounds = new Rect();
textView.getPaint().getTextBounds(textView.getText().toString(), 0, textView.getText().length(), bounds);
bounds.width()
даст вам точную ширину текста в текстовом представлении.
Ответ 3
По какой-то причине решение Midverse Engineer не дает мне всегда правильных результатов (по крайней мере, на некоторых версиях Android). Решение Sherif elKhatib работает, но имеет побочный эффект изменения MeasuredWidth и Height. Это может привести к некорректному позиционированию textView.
Мое решение:
width = textView.getPaint().measureText(text);
metrics = textView.getPaint().getFontMetrics();
height = metrics.bottom - metrics.top;
Ответ 4
Использование внутреннего класса TextView Paing
не так уж и жарко, если у вас несколько строк текста и разные отступы. Так что перестаньте пытаться изобретать велосипед. Используйте методы getMeasuredHeight
и getMeasuredWidth
после вызова measure(UNSPECIFIED, UNSPECIFIED)
. Только не забудьте получить новые значения внутри поста, иначе в большинстве случаев вы получите неправильный результат.
tv.setText(state.s);
tv.measure(UNSPECIFIED,UNSPECIFIED);
tv.post(new Runnable() {
@Override
public void run() {
Log.d("tv","Height = "+tv.getMeasuredHeight());
Log.d("tv","Width = "+tv.getMeasuredWidth());
}
});