1. 程式人生 > >canvas drawText 如何居中顯示。

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的座標。去試一試吧。