Home » Android » android – Getting height and width of a text using Canvas

android – Getting height and width of a text using Canvas

Posted by: admin May 14, 2020 Leave a comment

Questions:

I’m developing an Android 2.2 application.

I’m using this method to draw a text in a View:

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

How can I get height and width of name text?

If I do this (p is a Paint object):

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

I get With name = 'Loading', bounds = Rect(1, -10 - 42, 3);.

I don’t know why I get this strange rectangle.

Any clue?

This is my possible solution:

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);
        }
    }
}

But, it doesn’t work. I get that strange rectangle.

How to&Answers:

A text size is measured from its baseline, and has an ascent (upwards, so -y) and descent (downwards, y). The first y-value in your rect (-10) is the ascent, the second the descent (3). Width of the text is 41 (42-1). Height thus is |ascent| + |descent| is 10 + 3 = 13;

Similarly p.getFontMetrics() has top and bottom attributes, which describe the highest ascent and descent the font you are using have. If you want to calculate the height of a text, then its Math.abs(p.ascent) + Math.abs(p.descent) You can also measure the width of a text with p.measureText().

Answer:

You can use Paint.setTextSize() to set the text size, and then paint it in the Canvas.