[Android]Android字体高度的研究

android自定义View绘制的时候,会有很多情况下要与字体打交道,涉及到字体宽度、高度的时候要特别注意一下几个概念,见图:

 

 

 

baseLine:一行文字的底线。

Ascent: 字符顶部到baseLine的距离。

Descent: 字符底部到baseLine的距离。

Leading: 字符行间距。

 

 

public class TestOnDraw extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		MyView v = new MyView(this);
		this.setContentView(v);
	}
}

class MyView extends View
{

	public MyView(Context context) {
		super(context);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		Paint p = new Paint();
		p.setColor(Color.WHITE);
		p.setTextSize(50);
		p.setAntiAlias(true);
		FontMetrics fm = p.getFontMetrics();
		
		System.out.println("top = "+ fm.top);
		System.out.println("ascent = "+ fm.ascent);
		System.out.println("descent = "+ fm.descent);
		System.out.println("bottom = "+ fm.bottom);
		System.out.println("leading = "+ fm.leading);
		
        int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2);
        System.out.println("textHeight = "  + textHeight);
        
        float width =500;
        float baseline = 100f;
        float offsetAscent = baseline + fm.ascent;
        float offsetDescent = baseline +fm.descent;
        float offsetTop = baseline + fm.top;
        float offsetBottom = baseline + fm.bottom;
        
        canvas.drawText("中国 bp Android", 0, baseline, p);
		
		canvas.drawLine(0, baseline, width, baseline, p);//baseline
		canvas.drawLine(0, offsetAscent, width, offsetAscent, p);//ascent
		canvas.drawLine(0, offsetDescent, width, offsetDescent, p);//descent
		canvas.drawLine(0, offsetTop, width, offsetTop, p);//top
		canvas.drawLine(0, offsetBotton, width, offsetBottom, p);//bottom
	}
}
 

运行效果:


 

 

这是程序的输出结果:


 

得出结论: canvas drawText() 的startX是从左下角的baseline的底线开始绘画的,如果我们要得到字体的高度需要关注descent - ascent (ascent线在baseline上面,所以是负数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值