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的一半,使其正好居中
浙公网安备 33010602011771号