查询了google发现在android一下有几种方法可以做到,但是经过实际测试发现下面这种方法是最准确的

Rect bounds = new Rect();
String text = "Hello World";
TextPaint paint;

paint = findViewById(R.id.hello_world).getPaint();
paint.getTextBounds(text, 0, text.length(), bounds);
int width = bounds.width();

 

``` Paint pFont = new Paint(); Rect rect = new Rect(); pFont.getTextBounds("豆", 0, 1, rect); Log.v(TAG, "height:"+rect.height()+"width:"+rect.width());
  
  ## Android_FontMetrics对象的各种基准线(以及怎么获取文字的width和height)
</div>

Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。

public static class FontMetrics { /** * The maximum distance above the baseline for the tallest glyph in * the font at a given text size. / public float top; /* * The recommended distance above the baseline for singled spaced text. / public float ascent; /* * The recommended distance below the baseline for singled spaced text. / public float descent; /* * The maximum distance below the baseline for the lowest glyph in * the font at a given text size. / public float bottom; /* * The recommended additional space to add between lines of text. */ public float leading; }


它的各基准线可以参考下图:

![](http://my.csdn.net/uploads/201206/07/1339061786_4121.PNG) 

上图其实是通过<span class="wp_keywordlink">[代码](http://www.xuebuyuan.com/)</span>画出来的,具体代码如下:

/** 绘制FontMetrics对象的各种线 */ mPaint.reset(); mPaint.setColor(Color.WHITE); mPaint.setTextSize(80); // FontMetrics对象 FontMetrics fontMetrics = mPaint.getFontMetrics(); String text = “abcdefg”; // 计算每一个坐标 float textWidth = mPaint.measureText(text); float baseX = 30; float baseY = 700; float topY = baseY + fontMetrics.top; float ascentY = baseY + fontMetrics.ascent; float descentY = baseY + fontMetrics.descent; float bottomY = baseY + fontMetrics.bottom; // 绘制文本 canvas.drawText(text, baseX, baseY, mPaint); // BaseLine描画 mPaint.setColor(Color.RED); canvas.drawLine(baseX, baseY, baseX + textWidth, baseY, mPaint); mPaint.setTextSize(20); canvas.drawText(“base”, baseX + textWidth, baseY, mPaint); // Base描画 canvas.drawCircle(baseX, baseY, 5, mPaint); // TopLine描画 mPaint.setColor(Color.LTGRAY); canvas.drawLine(baseX, topY, baseX + textWidth, topY, mPaint); canvas.drawText(“top”, baseX + textWidth, topY, mPaint); // AscentLine描画 mPaint.setColor(Color.GREEN); canvas.drawLine(baseX, ascentY, baseX + textWidth, ascentY, mPaint); canvas.drawText(“ascent”, baseX + textWidth, ascentY + 10, mPaint); // DescentLine描画 mPaint.setColor(Color.YELLOW); canvas.drawLine(baseX, descentY, baseX + textWidth, descentY, mPaint); canvas.drawText(“descent”, baseX + textWidth, descentY, mPaint); // ButtomLine描画 mPaint.setColor(Color.MAGENTA); canvas.drawLine(baseX, bottomY, baseX + textWidth, bottomY, mPaint); canvas.drawText(“buttom”, baseX + textWidth, bottomY + 10, mPaint);


相信通过以上<span class="wp_keywordlink">[程序](http://www.xuebuyuan.com/)</span>,能够很好的理解topLine,buttomLine,baseLine,ascentLine,descentLine。

另外:Paint类有两个方法

/**

  • Return the distance above (negative) the baseline (ascent) based on the
  • current typeface and text size.
  • @return the distance above (negative) the baseline (ascent) based on the
  •     current typeface and text size.
    

*/ public native float ascent();

/**

  • Return the distance below (positive) the baseline (descent) based on the
  • current typeface and text size.
  • @return the distance below (positive) the baseline (descent) based on
  •     the current typeface and text size.
    

*/ public native float descent();


ascent():the distance above the baseline(baseline以上的height)

descent():the distance below the baseline(baseline以下的height)

所以ascent() + descent() 可以看成文字的height。

到此为止,怎么获取文字的height和width都已经揭晓了:

获取height : mPaint.ascent() + mPaint.descent()

获取width : mPaint.measureText(text)

&nbsp;

💬 评论