聊一聊Paint.FontMetrics.descent和Paint.FontMetrics.ascent那些事

就在昨天看到gjz的一个库的时候,遇到了一个大坑。其实说起来被某一篇文章给坑大了,本人也超喜欢gjz写的一些库文件,貌似有些崇拜了。
gjz的github:https://github.com/gjiazhe
库地址:https://github.com/gjiazhe/MultiChoicesCircleButton
以前在canvas.drawText的时候总是没有设置paint的align属性,这里说一下如果你的paint.setTextAlign(Paint.Align.CENTER);是这样的话,那么你就要注意了canvas.drawText(String text, float x, float y, Paint paint)的第二个和第三个参数了,x指的是文本的横向的中点坐标,y指的是文本的baseLineY在屏幕上面的纵坐标。当时看到

final float baseLineY = mCircleCentreY - radius - textHeight / 2- (fontMetrics.descent - fontMetrics.ascent) / 2 - fontMetrics.ascent;

这样去算出文字的baseLineY的值,后来去找资料fontMetrics.descentfontMetrics.ascent都表示的是什么,
结果查到的文章是这样的:

Ascent是baseline之上至字符最高处的距离
Descent是baseline之下至字符最低处的距离

聊一聊Paint.FontMetrics.descent和Paint.FontMetrics.ascent那些事_第1张图片
说明图.png

这个是网上的说明图,我只是拿来用用,更为了好说明。如果都是距离的话 fontMetrics.descent - fontMetrics.ascent这里就难得理解是文字占据的高度,这让我很纳闷。经过之后的debug测试后,发现 fontMetrics.ascent是一个负值,看到一个负值后,终于理解了gjz为啥是这么算出文本占据的高度了。

总结:

fontMetrics.descent是baseline之上至字符最高处的位移,而不是高度,因此这里是一个正直
fontMetrics.ascent是baseline之下至字符最低处的位移,而不是高度,因此这里是一个负值

你可能感兴趣的:(聊一聊Paint.FontMetrics.descent和Paint.FontMetrics.ascent那些事)