使用Canvas获取文本的高度和宽度

10

我正在开发一个Android 2.2应用程序。

我正在使用这种方法在View中绘制文本:

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

我使用 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);
        }
    }
}

但是,它不起作用。我得到了那个奇怪的矩形。

2个回答

28

文本大小是从其基线测量的,具有上升(向上,因此为负y)和下降(向下,y)的高度。您矩形中的第一个y值(-10)是上升,第二个y值(3)是下降。文本的宽度为41(42-1)。因此,高度为|ascent| + |descent|,即10+3=13;

同样,p.getFontMetrics() 具有顶部和底部属性,描述了您正在使用的字体的最高上升和下降。如果要计算文本的高度,则为 Math.abs(p.ascent) + Math.abs(p.descent)。您还可以使用 p.measureText() 测量文本的宽度。


0
你可以使用 Paint.setTextSize() 来设置文本大小,然后在 Canvas 中绘制它。

1
谢谢你的回答。如果我使用你的解决方案,它会修复我的问题吗?我不明白它如何适用于我的问题。 - VansFannel
如果您自己定义尺寸,您就会知道它。 - Michell Bak
我已经添加了p.setTextSize(32);,但是我得到的结果仍然是:bounds = Rect(3, -25 - 113, 3); - VansFannel
textSize不是文本的高度,对吗? - powerj1984

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接