canvas drawText 如何居中顯示。
網上很多關於將text居中到某個矩形或者bitmap中的例子,但是我覺得很多是錯的,特別是一些人希望通過觀察然後設定某個偏移量讓它儘可能居中,我覺得這是再誤人子弟。android連text居中都做不到的話,那它就改退出這個市場了。
當然這篇文章講的不是很詳細,特別是對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的座標。去試一試吧。