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的一半,使其正好居中

posted @ 2015-08-31 14:06  轻云沉峰  阅读(1155)  评论(0)    收藏  举报