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

时间:2011-10-10 10:12:41

标签: android text 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);

我得到了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 个答案:

答案 0 :(得分:28)

文本大小是从其基线开始测量的,并且具有上升(向上,如此-y)和下降(向下,y)。 rect(-10)中的第一个y值是上升,第二个是下降(3)。文字宽度为41(42-1)。因此高度为|上升| + |血统|是10 + 3 = 13;

同样地,p.getFontMetrics()具有顶部和底部属性,这些属性描述了您使用的字体的最高上升和下降。如果您想计算文字的高度,那么Math.abs(p.ascent) + Math.abs(p.descent)您还可以使用p.measureText()来衡量文字的宽度。

答案 1 :(得分:0)

您可以使用Paint.setTextSize()设置文字大小,然后将其绘制在Canvas