有些小伙伴在自定義View的時(shí)候需要畫(huà)文字朴爬,當(dāng)畫(huà)文字的基線的時(shí)候出現(xiàn)不少問(wèn)題琐旁,
調(diào)用 canvas.drawText(text, x , y , paint); 這里的text字體枷邪,x開(kāi)始的位置酵熙,y基線桅咆,paint畫(huà)筆王浴,計(jì)算基線y的時(shí)候出現(xiàn)問(wèn)題斗遏。
話不多說(shuō)山卦,直接上圖:
圖中,Baseline就是我們所說(shuō)的基線诵次,注意账蓉,基線并不是中線,如果簡(jiǎn)單認(rèn)為是中線的話逾一,
相當(dāng)于 y=getHeight()/2 也就是 canvas.drawText(text, x , getHeight()/2 , paint)
這樣的話就出現(xiàn)如下結(jié)果:
是不是跟想象中的不一樣呢铸本,其實(shí)就是基線的問(wèn)題,那么根據(jù)圖1如何求基線呢嬉荆。
由圖可知归敬,注意坐標(biāo)軸是從上到下,從左到右的鄙早,Baseline到頂部的距離叫 top (相對(duì)坐標(biāo)軸來(lái)說(shuō)是個(gè)負(fù)數(shù))汪茧, Baseline到底部的距離叫 bottom (相對(duì)坐標(biāo)軸來(lái)說(shuō)是個(gè)正數(shù)),然后我們已知的條件有文字的高度bottom - top , 那么如果畫(huà)一條中間線限番,中間線的高度就是 ( bottom - top ) /2(圖中沒(méi)展示舱污,小伙伴自行想象),這就是我們的中線,然后發(fā)揮我們的數(shù)學(xué)才能
基線 = getHeight()/2 + 中線到基線的距離
假設(shè)中線到基線的距離為 dy
那么dy怎么算弥虐,根據(jù)我們上面計(jì)算的文字高度的一半 ( bottom - top ) /2 再減去bottom的高度扩灯,所以
dy = ( bottom - top ) /2 - bottom
所以 基線 = getHeight() + dy
計(jì)算文字的高度需要用到 FontMetricsInt ,不懂的小伙伴自行百度一下霜瘪。
這樣就計(jì)算完了珠插。運(yùn)行結(jié)果如下:
放一份自定義textview代碼中onDraw()畫(huà)文字的代碼:
protected void onDraw(Canvas canvas) {
//畫(huà)文字,text字體颖对,x開(kāi)始的位置捻撑,y基線,paint畫(huà)筆
Paint.FontMetricsInt fontMetricsInt =mPaint.getFontMetricsInt();
//dy等于文字高度的一半到基線的距離 baseLine等于基線
int dy = ( fontMetricsInt.bottom - fontMetricsInt.top )/2 - fontMetricsInt.bottom;
int baseLine = getHeight()/2 + dy;
canvas.drawText( mText,0, baseLine,mPaint );
}
謝謝缤底。