關(guān)于canvas文字居中的問題,特別是上下居中,垂直居中

font

這是一個文字的坐標系

這是一個非常蛋疼的坐標系


在canvas中怎么才能把文字畫在正中間????下面我們來討論一下


canvas有個方法專門繪制文字

canvas.drawText(text , X, Y, mPaint);   //這是比較常用的方法

左右居中很好實現(xiàn),只要給Paint設(shè)置一下就好了

mPaint.setTextAlign(Paint.Align.CENTER);

這樣把你計算的文字的中心點的X坐標傳入canvas.drawText(text , X, Y, mPaint)就好;


但是Y軸的中心點就非常蛋疼了!!!

因為drawText方法傳入的Y參數(shù)的坐標既不是文字的底端(descent),也不是文字的中間,而是baseline的位置!!!!

++我們可以計算出文字居中后 中心點的Y軸坐標,但是怎么才能獲取baseline的Y軸坐標呢????++

唉...數(shù)學(xué)老師死得早....

/**
*   FontMetrics中保存了文字的一些屬性
*       其中規(guī)定了baseline = 0
*       而其他值都是相對于baseline的坐標,這個坐標是一個文字自己的坐標系,與外部無關(guān)
*
* 我們來對照上面的圖來看看--------------------------------------
*       public float top        (這個是最上面,是個負值)
*       public float ascent     (這個是文字所繪制到的頂端,是個負數(shù))
*       public float descent    (這個是文字所繪制到的底端,是個正數(shù))
*       public float bottom     (這個是最下面,是個正數(shù))
*   ------------------------------------------------------------
*       好了,有了這些可以計算出baseline在繪制的時候的Y坐標了
*/

Paint.FontMetrics fm = mPaint.getFontMetrics(); 

//假設(shè)已經(jīng)計算出文字上下居中后Y軸的坐標為 ---> y;
float textY = y + (fm.descent - fm.ascent) / 2 - fm.descent;
//  --------------------------------------------------

好了如果以后需要自己繪制文字,而又想要居中的同學(xué),這么計算就沒問題了!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容