Получить размер текста в TextView

У меня проблема с размещением textView в координатах x и y указанного центра. Во-первых, я попытался установить текст в textView и переместить представление с шириной и высотой представления по этой ссылке.

Но это не работает, и я хотел бы попробовать что-то еще. Я хотел бы знать, есть ли способ получить размер, который будет иметь указанный текст в моем текстовом представлении? Я имею в виду, что я знаю текст и textSize, как я могу получить ширину и высоту моего textView?

Что-то вроде метода (NSString)sizeWithFont; для тех, кто разбирается в iPhone dev.


person Imotep    schedule 18.07.2011    source источник


Ответы (4)


Если ваш textview называется tv

tv.setText("bla");
tv.measure(0, 0);       //must call measure!
tv.getMeasuredHeight(); //get height
tv.getMeasuredWidth();  //get width

Подробнее об этом (обновлено): Как получить ширину/высоту представления

person Sherif elKhatib    schedule 18.07.2011
comment
Иногда это на самом деле не дает точной меры, особенно если вы используете просмотр списка. - person nunofmendes; 28.02.2013
comment
@nunofmendes ты прав. Я расширил эту тему: проверьте sherif.mobi /2013/01/how-to-get-widthheight-of-view.html - person Sherif elKhatib; 28.02.2013
comment
@MarceloFilho Я не знаю, почему он открывается в одних местах и ​​ломается в других. Вы можете попробовать это sherifandroid.blogspot.com/ 2013/01/ - person Sherif elKhatib; 10.05.2014
comment
Если текст содержит какие-либо строки, которые будут перенесены, вам нужно установить для ширины MeasureSpec значение AT_MOST, чтобы получить точную высоту. Пример кода здесь: stackoverflow.com/a/20087258/462162 - person arlomedia; 12.11.2014
comment
Ваша обновленная ссылка (sherif.mobi/2013/ 01/how-to-get-widthheight-of-view.html), работает как шарм. Спасибо чувак :) - person Shailesh; 09.11.2016

Rect bounds = new Rect();

textView.getPaint().getTextBounds(textView.getText().toString(), 0, textView.getText().length(), bounds);

bounds.width() даст вам точную ширину текста в текстовом представлении.

person Midverse Engineer    schedule 28.05.2014
comment
Как мы любим говорить здесь: это должен быть ответ на ОП. Другой ответ — это обычный старый метод измерения представления, а не строки в представлении. - person Léon Pelletier; 08.08.2014
comment
pathView.getPaint().getTextBounds(pathView.getText().toString(), 0, pathView.getText().length(), границы); - person XurajB; 17.12.2014
comment
это также работает с высотой многострочного TextView? - person Hendra Anggrian; 21.12.2016
comment
результат включает заполнение? - person ucMedia; 16.10.2019
comment
ну это не точно, я получаю две строки вместо одной, когда ввожу текст - person user924; 10.03.2020

По какой-то причине решение Midverse Engineer не всегда дает мне правильные результаты (по крайней мере, на некоторых версиях Android). Решение Sherif elKhatib работает, но имеет побочный эффект изменения измеряемой ширины и высоты. Это может привести к неправильному позиционированию textView.

Мое решение:

width = textView.getPaint().measureText(text);
metrics = textView.getPaint().getFontMetrics();
height = metrics.bottom - metrics.top;
person Marcel W    schedule 21.04.2016

Использование внутреннего класса Paing TextView не так уж и популярно, когда у вас есть несколько строк текста и разные отступы. Так что перестаньте пытаться изобретать велосипед. Используйте методы 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());
    }
});
person ucMedia    schedule 16.10.2019