Получение высоты и ширины текста с использованием Canvas

Я разрабатываю приложение для Android 2.2.

Я использую этот метод для рисования текста в представлении:

    public void draw(Canvas c)
    {
        p.setColor(Color.WHITE);
        if(name != null)
            c.drawText(name, getLeft(), getTop(), p);
    }

Как получить высоту и ширину имени?

Если я это сделаю (p - объект Paint):

p.getTextBounds(name, 0, name.length(), bounds);

Я получаю With name = 'Loading', bounds = Rect(1, -10 - 42, 3);.

Я не знаю, почему я получаю этот странный прямоугольник.

Любая подсказка?

Это мое возможное решение:

public class MyView extends ARSphericalView
{
    public String name;

    public MyView(Context ctx)
    {
        super(ctx);
        inclination = 0;
    }

    public void draw(Canvas c)
    {
        /*
        p.setColor(Color.WHITE);
        if(name != null)
            c.drawText(name, getLeft(), getTop(), p);
        */
        p.setColor(Color.BLACK);
        if(name != null)
        {
            Rect bounds = new Rect();
            c.drawText(name, getLeft(), getTop(), p);
            setBackgroundColor(Color.WHITE);
            p.getTextBounds(name, 0, name.length(), bounds);
            c.drawRect(bounds, p);
        }
    }
}

Но это не сработает. Я получаю этот странный прямоугольник.

Ответ 1

Размер текста измеряется от базовой линии и имеет восхождение (вверх, so -y) и спуск (вниз, y). Первое y-значение в вашем rect (-10) - это восхождение, второе - спуск (3). Ширина текста - 41 (42-1). Таким образом, высота подъема | + | спуск | составляет 10 + 3 = 13;

Аналогично p.getFontMetrics() есть атрибуты верхнего и нижнего уровня, которые описывают наибольшее восхождение и спуск шрифта, который вы используете. Если вы хотите рассчитать высоту текста, тогда его Math.abs(p.ascent) + Math.abs(p.descent) Вы также можете измерить ширину текста с помощью p.measureText().

Ответ 2

Вы можете использовать Paint.setTextSize(), чтобы установить размер текста, а затем нарисуйте его в Canvas.