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

Как быстро получить ширину и высоту 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 измененных динамически очень быстро.

4b9b3361

Ответ 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");