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

于 2015-09-10 首发在Hyman’s Blog

在android自定义控件中经常用到canvas.drawText方法来绘制文本,我自己在用这个方法的时候,有很多迷惑,首先对参数含义不明白,其次对实现文本居中的计算公式也不太理解。
经过查阅API文档和相关博文,终于算是对这两个疑点理解好了,下面就进行一下总结。

方法参数介绍

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

drawText参数介绍及绘制居中文本_第1张图片

可以看到,这四个参数依次为:
text:需要绘制的文本;
x:文本的水平方向原点距其所在view左边的距离。原点默认是字符串的的最左边,如果设置了paint.setTextAlign(Paint.Align.CENTER);那么原点就是字符串的中心了;
y:表示文本的baseline距离所在view的顶部的距离;
paint:用来绘制文本的画笔。

绘制居中文本

首先需要了解一个类,Paint.FontMetrics
这个类的在API中的介绍如下:

drawText参数介绍及绘制居中文本_第2张图片

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

注意:top、ascent是负数,bottom、descent是正数。

总结

他们之间的关系用图表示如下:(该图来自于参考博客)

drawText参数介绍及绘制居中文本_第3张图片

文本居中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

你可能感兴趣的:(Android应用开发)