Как быстро получить ширину и высоту TextView с помощью Paint.getTextBounds()?
В классе Paint есть метод: Paint.getTextBounds(), который возвращает Rect
, занятый некоторым текстом. Но в соответствии с ответом this он возвращает что-то другое, чем ширина/высота TextView.
Q1: Есть ли способ получить ширину и высоту TextView с помощью Rect
, возвращенный Paint.getTextBounds()
Примечание. Мне нужно знать ширину/высоту точно. Я с удовольствием узнаю верхнюю границу Rect
с возможной ошибкой около 2-3%, но она ДОЛЖНА быть не больше (и должна работать на любом телефоне, не зависящем от разрешения экрана и плотности пикселей), тогда TextView ограничивает
Q2: Есть ли какой-либо другой метод QUICK для определения ширины и высоты некоторого текста с указанным textSize?
Я знаю, что ширина может быть определена Paint.measureText(), но это не возвращает высоту. Высота можно определить, создав новый StaticLayout
с текстом, а затем вызывая StaticLayout.getHeight(), но это слишком медленно. Мне нужно что-то более быстрое.
Фон для всего этого заключается в создании AutoFitTextView
, который автоматически подгоняет текст внутри своих границ с помощью размера текста вверх или вниз, и он должен делать это быстро, так как будет много таких AutoFitTextView
измененных динамически очень быстро.
Ответы
Ответ 1
Нашел простой и не медленный метод определения ширины/высоты текста, нарисованного с помощью специального Paint
, который не использует StaticLayout
.
public int getTextWidth(String text, Paint paint) {
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
int width = bounds.left + bounds.width();
return width;
}
public int getTextHeight(String text, Paint paint) {
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.bottom + bounds.height();
return height;
}
Краткое описание трюка: Paint.getTextBounds(String text, int start, int end, Rect bounds)
возвращает Rect
, который не начинается с (0,0)
. То есть, чтобы получить фактическую ширину текста, которая будет установлена вызовом Canvas.drawText(String text, float x, float y, Paint paint)
с тем же Paint
объектом из getTextBounds()
, вы должны добавить левую позицию Rect
.
Обратите внимание на это bounds.left
- это ключ к проблеме.
Таким образом вы получите ту же ширину текста, которую вы получили бы с помощью Canvas.drawText()
.
Более подробное объяснение дается в этом ответе.
Ответ 2
С java я использовал класс FontMetrics.
Font f= new Font("Arial", Font.BOLD, 16);
FontMetrics metric = getFontMetrics(f);
metric.stringWidth("the text I want to measure");