【Android基本功】Pain.drawText 實現(xiàn)文字垂直居中

平時我們在自定義View經(jīng)常會遇到text的繪制非竿,經(jīng)常會需要文字水平居中,垂直居中谋竖,水平居中比較簡單红柱,而垂直居中稍微復雜,所以我們這里討論下垂直居中蓖乘。這里涉及到一個關鍵類Paint.FontMetrics锤悄,可以通過Paint實例的getFontMetrics()獲得,其中封裝幾個垂直相關的參數(shù)嘉抒。

  • ascent:是baseline之上至字符最高處的距離
  • descent:是baseline之下至字符最低處的距離
  • top:指的是指的是最高字符到baseline的值零聚,即ascent的最大值
  • bottom:指的是最下字符到baseline的值,即descent的最大值

當我們在設置paint.setTextSize(80)后些侍,打印日志:

06-24 02:56:54.792 7383-7383/sample.kingja.canvas E/FontMetricsView: top: -83.828125
06-24 02:56:54.792 7383-7383/sample.kingja.canvas E/FontMetricsView: ascent: -74.21875
06-24 02:56:54.792 7383-7383/sample.kingja.canvas E/FontMetricsView: descent: 19.53125
06-24 02:56:54.792 7383-7383/sample.kingja.canvas E/FontMetricsView: bottom: 21.679688

我們發(fā)現(xiàn)4個參數(shù)有有正數(shù)握牧,有負數(shù),根據(jù)上面的說明后娩梨,現(xiàn)在我們可以確定baseline在里面充當了一個基準線沿腰,也就是0位置。于是我們先用以下坐標點作為一個baseline的坐標繪制一段文字狈定。measuredWidth颂龙,measuredHeight 為控件的寬习蓬,高。

baseX = measuredWidth * 0.5f - textWidth * 0.5f;//textWidth = paint.measureText(text)
baseY = measuredHeight * 0.5f;

為了直觀措嵌,我們用直線實體化了這幾個參數(shù)躲叼,效果如下:



我們發(fā)現(xiàn)文字已經(jīng)完成了水平居中,這樣只要將font middle這條白線降到控件的中間黑線就可以實現(xiàn)垂直居中了企巢,那么只要求出偏移量offsetY就可以了枫慷,很明顯,font middle到base的距離=文字高度/2-bottom到base的距離

float offsetY=0.5f*fontHeight-bottom;
baseY+=offsetY;

按照新的baseline坐標浪规,我們畫出的文字效果圖如下:

fontHeight = bottom - top效果圖

基本完成了需求或听,但是由于這個時候我們fontHeight = bottom - top,感覺效果并不是很理想笋婿,因為ascent以上到top挺多空隙誉裆,而descent到bottom的空隙并不大,這會讓人感覺到文字略微偏下缸濒,但是Android既然設置了top和bottom足丢,那么文字的高度范圍可以被認為在bottom和top之間。所以大家如果想要更理想的效果可把fontHeight設為descent-ascent庇配。我個人覺得斩跌,fontHeight = bottom - top這樣更穩(wěn)妥點。當然我也做出了效果捞慌,大家可以對比下:

兩種計算方式效果圖

看得出滔驶,雖然差別不多,但是還是有所出入卿闹,比如“好”字那個子的橫筆畫,一個在中線下萝快,一個在中線上锻霎。

最后給出兩種計算方式的公式:

  • 以fontHeight = bottom - top為文字高度
baseY = measuredHeight * 0.5f+(bottom - top)*0.5f-bottom;
  • 以fontHeight = descent- ascent為文字高度
baseY = measuredHeight * 0.5f+(descent-ascent)*0.5f-descent;

我想,到現(xiàn)在揪漩,大家應該比較確定旋恼,這是靠譜的垂直居中了吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末奄容,一起剝皮案震驚了整個濱河市冰更,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昂勒,老刑警劉巖蜀细,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異戈盈,居然都是意外死亡奠衔,警方通過查閱死者的電腦和手機谆刨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來归斤,“玉大人痊夭,你說我怎么就攤上這事≡嗬铮” “怎么了她我?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迫横。 經(jīng)常有香客問我番舆,道長,這世上最難降的妖魔是什么员淫? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任合蔽,我火速辦了婚禮,結果婚禮上介返,老公的妹妹穿的比我還像新娘拴事。我一直安慰自己,他們只是感情好圣蝎,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布刃宵。 她就那樣靜靜地躺著,像睡著了一般徘公。 火紅的嫁衣襯著肌膚如雪牲证。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天关面,我揣著相機與錄音坦袍,去河邊找鬼。 笑死等太,一個胖子當著我的面吹牛捂齐,可吹牛的內容都是我干的。 我是一名探鬼主播缩抡,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼奠宜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞻想?” 一聲冷哼從身側響起压真,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蘑险,沒想到半個月后滴肿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡佃迄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年嘴高,在試婚紗的時候發(fā)現(xiàn)自己被綠了竿音。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拴驮,死狀恐怖春瞬,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情套啤,我是刑警寧澤宽气,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站潜沦,受9級特大地震影響萄涯,放射性物質發(fā)生泄漏。R本人自食惡果不足惜唆鸡,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一涝影、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧争占,春花似錦燃逻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至握童,卻和暖如春姆怪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澡绩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工稽揭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肥卡。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓溪掀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親召调。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容