Canvas类使用过程中的总结

一.drawText

   1. canvas.drawText(text, x, y, paint);

     text和paint不必多说,x,y确定了字的位置,其中x默认是这个字符串的左边在屏幕的位置,y是指定这个字符baseline在屏幕上的位置。

    例如:

canvas.drawText(text, getWidth()/2, getHeight()/2, mPaint);

    我们把自定义组件的中心坐标传给x,y:

       (蓝线为baseline)

  我们也可以通过设置

mPaint.setTextAlign(Paint.Align.CENTER);
canvas.drawText(text, getWidth()/2, getHeight()/2, mPaint);

这样文本横向居中了



2. 文字垂直居中

     先看下图:

    (图片截自博主云涛yuntao

仔细观察上图文字区域,我们会发现文字区域中有5条颜色不同的线。按着从上到下的顺序,他们的名字分别是:
top
ascent
baseline
descent
bottom
如果你尝试过将两个TextView上下排列,没有margin和padding,那么你一定会发现,两个TextView文字之间依然是有空隙的。首先我们需要设置includeFontPadding为false!但是依然有空隙,这时的空隙就是由top与ascent之间的空隙和bottom与descent直接的空隙造成的了。

那5条线的位置是由使用的字体和字号决定的。Paint提供了获取上面5条线位置的方法,例如:

FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();      
ascent=fontMetrics.ascent;
一般情况下,我们使用的字符是在ascent与descent之间的,所以我们让ascent与descent之间的部分相对我们的View居中即可。
以baseline为基准,向上为负,向下为正。ascent为负数,descent为正数。

从绘制的结果可以清晰的看出,五条线之与文字的位置。实际文字的绘制是以baseLine的位置为基准的。
那么要想让文字也以中心为基准,需要让整体下移一些,以下图为例:


我们要下移的距离就是箭头标出的距离,字符所占高度的一半减去基准线以下的距离。这样再加上我们本来的位置y即可。

                mPaint.setTextAlign(Paint.Align.CENTER);
		mPaint.setTextSize(32);
		mPaint.setAntiAlias(true);
		FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
		int baseLine = getHeight() / 2+ (fontMetrics.descent - fontMetrics.ascent) / 2- fontMetrics.descent;
		canvas.drawText(text, getWidth() / 2, baseLine, mPaint);
		
		//baseline
		mPaint.setColor(Color.BLUE);
		canvas.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2, mPaint);

效果图:






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值