FontMetrics
参考资料:http://blog.csdn.net/aigestudio/article/details/41447349
FontMetrics字体度量,该类是Paint的内部类,通过getFontMetrics()方法可获取字体相关属性
1、字体相关的定义
baseline Android文本绘制是一baseline为基准的
ascent baseline到字符最高处距离称为上坡度
descent baseline到字符最低处距离称为下坡度
leading 上一行文字的descent到当前行文字的ascent称为行距
top bottom ascent与descent上面与下面还会有一段预留的空间,用于显示读音符号等所有就有了top和bottom的概念
通过代码获取相关属性值
mFontMetrics = mPaint.getFontMetrics(); Log.d("", "leading:" + mFontMetrics.leading); Log.d("", "ascent:" + mFontMetrics.ascent); Log.d("", "descent:" + mFontMetrics.descent); Log.d("", "top:" + mFontMetrics.top); Log.d("", "bottom:" + mFontMetrics.bottom);
ascent:-46.38672
descent:12.207031 baseline到字符最低处距离为下坡度
leading:0.0 上一行文字的descent到当前行文字的ascent之间的距离为行间距,因为第一行所以为0
top:-52.807617
bottom:13.549805
top与bottom始终比ascent与descent大一点,TextView设置android:includeFontPadding="false"可以去掉一定的边距值,但不能完全去掉
2、文本居中显示的代码
public class FontView extends View{ private static final String text = "文字 are you ok"; private Paint mPaint; private Paint.FontMetrics mFontMetrics; public FontView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setTextSize(50); mPaint.setColor(Color.BLACK); mFontMetrics = mPaint.getFontMetrics(); Log.d("", "leading:" + mFontMetrics.leading); Log.d("", "ascent:" + mFontMetrics.ascent); Log.d("", "descent:" + mFontMetrics.descent); Log.d("", "top:" + mFontMetrics.top); Log.d("", "bottom:" + mFontMetrics.bottom); } @Override protected void onDraw(Canvas canvas) { int baseX = (int) (canvas.getWidth()/2 - mPaint.measureText(text)/2); int baseY = (int) (canvas.getHeight()/2 - (mPaint.descent()+mPaint.ascent())/2); baseY = (int) (canvas.getHeight()/2); canvas.drawText(text, baseX, baseY, mPaint); mPaint.setColor(Color.BLUE); canvas.drawLine(0, canvas.getHeight()/2, canvas.getWidth(), canvas.getHeight()/2, mPaint); } }
Y轴上设置为Math.abs(mFontMetrics.top),实际是将baseline起点向下移动top的距离,让文本顶部与屏幕顶部重合,文本的居中正好是高度的一半减掉ascent与descent的一半,使其正好居中