drawText参数介绍及绘制居中文本

  在android自定义控件中经常用到canvas.drawText方法来绘制文本,我自己在用这个方法的时候,有很多迷惑,首先对参数含义不明白,其次对实现文本居中的计算公式也不太理解。

  经过自己查阅相关博文以及请教一些大神,终于算是对这两个疑点理解好了,下面就进行一下总结。

一、方法参数介绍

  首先可以看一下API上对这个方法的描述

drawText API

  可以看到,这四个参数依次为:

  1. text:需要绘制的文本;
  2. x:文本的水平方向原点距其所在view左边的距离。原点默认是字符串的的最左边,如果设置了paint.setTextAlign(Paint.Align.CENTER);那么原点就是字符串的中心了;
  3. y:表示文本的baseline距离所在view的顶部的距离;
  4. paint:用来绘制文本的画笔。

二、绘制居中文本

  1. 首先需要了解一个类,Paint.FontMetrics

  这个类的在API中的介绍如下:

FontMetrics

baseline为文本的基准线

  • ascent:是baseline之上至字符最高处的距离;
  • bottom:是文本中字符的最下边到baseline的距离,即descent的最大值;
  • descent:是baseline之下至字符最低处的距离;
  • leading:上一行文本的descent到当前行ascent之间的距离;
  • top:是文本中字符的最上边到baseline的距离,即ascent的最大值。

  注:top、ascent是负数,bottom、descent是正数。具体top、bottom与ascent、descent有什么区别从上面的描述中根本看不出来(上面的描述文字是借用的),如果哪位大神对top和ascent的区别比较清楚不妨指点我一下,谢谢

  他们之间的关系用图表示如下:(图是借用的)
fontmetrics_img](FontMetrics

  1. 文本居中baseline距view上边距的距离计算公式

  公式一:中心轴线距view顶部的距离-文本高度的一半+|ascent|

  int baseLine = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;

  或

  公式二:中心轴线距view顶部的距离+文本高度的一般-descent

  int baseLine = getMeasuredHeight()/2 + (fontMetrics.descent- fontMetrics.ascent)/2 - fontMetrics.descent;

  两个公式中top可以用ascent替换,bottom可以用descent替换,成对替换哦。

  这两个公式的理解:

  首先,文本居中的话那么文本的水平中心轴线应该和所在view的水平中心线重合;

  接下来,descent-ascent的值可以看做文本的高度,这里ascent是负数所以是减号(我之前看着公式弄迷糊了就是因为不清粗ascent是负数);

  能力有限,这些都只是整理网上别人写的博文加上自己的理解,如果有不妥的地方还望指正,不胜感激!

  我参考的博文有:
  http://blog.csdn.net/lovexieyuan520/article/details/43153275
  http://mikewang.blog.51cto.com/3826268/871765/
  http://blog.csdn.net/tianjf0514/article/details/7642656