Canvas drawText文字垂直居中方案

Canvas drawText文字垂直居中方案,第1张

最近绘制自定义view时,用到画笔绘制文本,针对drawText的绘制做一些总结。

Canvas.drawText的方法定义如下:

其中,x坐标比较好理解握败,是文本起始绘制位置的x坐标。但是y是指文本绘制的baseline的y坐标。

要理解上图中的绘制效果,让我们再认识下FontMetrics类,该类是Paint的内部类。

在设置好字体尺寸后,通过Paint.getFontMetricsInt()方法来获得一个FontMetrics对象。FontMetrics定义了几个绘制时要用到的关键坐标位置,各位置含义和图示如下。注意,这四个字段的值是相对于baseline的相对值。

即已知Top值,则段敏颤baseline = top - fontMetrics.top.

1、已知a段(bottom和baseline之间距离)高度:a = fontMetrics.bottom

2、计算b段(bottom和中线的距离)高度:b = (fontMetrics.bottom - fontMetrics.top)/2

3、计算c段(baseline和中拿并线的距离)高度:c=b-a

4、计算baseline = centerY + c = centerY + b -a = centerY - (fontMetrics.bottom + fontMetrics.top) /2

实际计算时,也可以用decent和asent,即baseline = centerY - (fontMetrics.ascent + fontMetrics.descent) /2

原理和场景2一致,此时centerY=(rect.bottom+rect.top)/2。

最终baseLine = (rect.bottom+rect.top)/2 - (fontMetrics.top + fontMetrics.bottom) /2

参考文档:

Android 图解Canvas drawText文字居中的那些事

drawText方法的baseline计算

Android Canvas drawText实现中文垂直居中

由于要实现类似注册表单一样,文字作用两端对齐的效果如下图1,所以才有下面的内容。悄信

在canvas中,调用drawText绘画文隐运困字的时候,希望能够在垂直方向居中画出文字。所以需要测量出要绘画的文字的高。但具体来说,也不是获取文字的高,因为如果要垂直居中画出文字,就必须拿到文字的baseline,于是在网上搜索,找到了一篇关于获取baseline的文章(文章链接在本文底部列出),感觉就是我想要的,但是基于要怀疑一切的态度,不能你说是什么就是什么的,实践才是检验真理的唯一标准,所以下面我们来验证一下几个观点。

首先可以明确,5个位置分别是灶念top,ascent,baseline,descent,bottom。这五个位置受字号的大小影响是毋庸置疑的,这里不再讨论。这里验证了一下字体对五个位置的影响。字号默认是16,字体分别是系统默认,行书,小篆,方正姚体:

这5个位置分别用5条不同颜色的横线条展示

从效果看,字体对top,ascent,baseline,descent,bottom的位置影响并不明显。

通过Log打印的日志可以得出结果

结果:以baseline为基准线,向上为负,向下为正是正确的。

这个不是验证了,说了那么多也就是为了如何在垂直方向居中绘制文字,关键在于获取baseline位置。Canvas中的drawText中绘制文字的基准线是baseline。

使得ascent到View的是上边距与descent到View下边距距离一致即可,此段距离加上ascent的绝对值(-ascent)即为baseline的位置。

在Canvas中使用drawText绘制垂直居中文字的关键在于求出baseline的位置。获取位置的公式:

https://github.com/lgygg/MeasureHeight

http://blog.csdn.net/su1216/article/details/46900617#


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11986932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存