Android中FontMetrics對象的各種基准線(以及怎麼獲取文字的width和height) 。
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;
- }
它的各基准線可以參考下圖:
上圖其實是通過代碼畫出來的,具體代碼如下:
- /** 繪制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);
相信通過以上程序,能夠很好的理解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)