网上很多关于将text居中到某个矩形或者bitmap中的例子,但是我觉得很多是错的,特别是一些人希望通过观察然后设置某个偏移量让它尽可能居中,我觉得这是再误人子弟。android连text居中都做不到的话,那它就改退出这个市场了。
废话不多说本人是从一篇文章中得到的启示,作为尊重他人我附上这篇文章,供大家参考。http://www.doc88.com/p-3953907358643.html
当然这篇文章讲的不是很详细,特别是对baseline这个值的求法是对的但是表达形式上我觉得不是很满意,所以做了下修改让人更容易明白。
说先要实现text的垂直居中,要先了解一些概念,那就是canvas.drawText("123", x, y, paint);这里的x,y到底指的是什么?x 代表的意思会根据paint的aline值决定,网上的说法就是。x默认是‘www.jcodecraeer.com’这个字符串的左边在屏幕的位置,如果设置了paint.setTextAlign(Paint.Align.CENTER)
就是,值字符中心的位置。
y 很明显就是指字符串baseline的的位置。那什么事baseline,我们看看一个图。
而字符串可以通过
FontMetrics fontMetrics = textPaint.getFontMetrics();
获取到字体的矩阵,而这个矩阵有相应的四个属性。
FontMetrics.top
FontMetrics.ascent
FontMetrics.descent
FontMetrics.bottom
看到这个图里面有5根线,第一根是是top,第二根是ascent,第三根是baseline,第四根跟第五根重叠在一起是descent,和bottom.
所以从图中看到baseline的位置就是我们要求的y的坐标。而这个坐标是如何求的呢。首先我们要求bottom这根线的坐标的方法是:
float bottomY = baseY + fontMetrics.bottom;
这里我们设,bottomY为bottom这根线的坐标,baseY是我们要求的y坐标,fontmetrics.bottom是相应的字体baseline线到bottom线的差值。
字体的高度float fontHeight = fontMetrics.bottom - fontMetrics.top;
而我们要让这个字符串居中在一个高度为height的矩形里。那这个字符串的底的坐标应该是 1/2 * height + 1/2 * fontHeight = bottomY.
所以根据之前的公式baseY = 1/2
* height + 1/2 * fontHeight - fontmetrics.bottom.
这就是你要cavans.drawText()里的y的坐标。去试一试吧。