Android 文字绘制”基线”★★★

1.文字基线

文字“基线”就如同写英语字母用的“四线本” 。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2f6Iqz6Iqz,size_19,color_FFFFFF,t_70,g_se,x_16在canvas利用drawText绘制文字时,也是有规则的,这个规则就是基线baseLine :给文字定了一条基准线,通过Paint.FontMetricsInt获取的top和bottom值就与基线有关。FontMetrics 基线上面的值为负数,基线下面的值为正数。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2f6Iqz6Iqz,size_20,color_FFFFFF,t_70,g_se,x_16

 可见基线就是四线格中的第三条线!

也就是说,只要基线的位置定了,那文字的位置必然是定了的!

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2f6Iqz6Iqz,size_20,color_FFFFFF,t_70,g_se,x_16可以通过测试把top、bottom值打印出来,发现 top 为 - 317,bottom 为 82 ,因此可以计算出基线(偏移)为117。

这里的top和bottom的值,实际是基于基线而得。可理解为:以文字基线为准,向上平移317像素为绘制区域的顶,向下平移82像素为绘制区域的底(基线向上为负 向下为正)。

已知基线与绘制区顶相距317,与底相距82,可以得出绘制区高度为bottom - top:82 - (-317) = 399。

绘制区中线高度为(bottom - top)/ 2 : 399 / 2 = 199 (int)。

绘制区中线高度等价于中线与绘制区底之间的距离,这个距离减去 基线与绘制区底 之间的距离,就是中线与基线之间的距离 (bottom - top) / 2 - bottom : 199 - 82 = 117。

 

2.canvas.drawText

那这个值和我们在android中绘制文字有什么关系呢?

其实在drawText方法中,中传入的第三个参数Y的实际意义是文字的基线所在的位置!

public void drawText(String text, float x, float y, Paint paint)  

上面这个构造函数是最常用的drawText方法,传进去一个String对象就能画出对应的文字。这里x、y两个参数需要非常注意,(x,y)是并不是绘制文字所在矩形的左上角的点。比如,要画"harvic's blog"这几个字,这个(x,y)坐标应当是下图中绿色小点的位置。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2f6Iqz6Iqz,size_20,color_FFFFFF,t_70,g_se,x_16

再强调一遍:y所代表的是基线的位置!

 

3.paint.setTextAlign(Paint.Align.XXX);

先看一张图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2f6Iqz6Iqz,size_20,color_FFFFFF,t_70,g_se,x_16

我们知道,在drawText(text, x, y, paint)中传进去的源点坐标(x,y);其中,y表示的基线的位置。那x代表什么呢?从上面的例子运行结果来看,应当是文字开始绘制的地方。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值