Android Canvas的drawText()與文字居中方案詳解
自定義View是繪制文本有三類方法
// 第一類 public void drawText (String text, float x, float y, Paint paint) public void drawText (String text, int start, int end, float x, float y, Paint paint) public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint) public void drawText (char[] text, int index, int count, float x, float y, Paint paint) // 第二類 public void drawPosText (String text, float[] pos, Paint paint) public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint) // 第三類 public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint) public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)
其中drawText()最常用,drawPosText ()是根據(jù)一個個坐標點指定文字位置,drawTextOnPath ()是根據(jù)路徑繪制。但drawText()的x,y參數(shù)是干嘛的呢?
先來測試下
Paint paint=new Paint(); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(12); paint.setTextSize(100); String text="測試:my text"; canvas.drawText(text, 200, 400, paint); //畫兩條線標記位置 paint.setStrokeWidth(4); paint.setColor(Color.RED); canvas.drawLine(0, 400, 2000, 400, paint); paint.setColor(Color.BLUE); canvas.drawLine(200, 0, 200, 2000, paint);
左對齊-left
可以看到,x,y并不是指定文字的中點位置,并且x,y與文字對齊方式有關(guān)(通過setTextAlign()指定,默認為left)
居中對齊-center
右對齊-right
(為了使文字完整,上面調(diào)整了下x,y的值)
從上面三種情況得出結(jié)論,x所對應(yīng)的豎線:
- 左對齊 — 文字的左邊界
- 居中對齊 — 文字的中心位置
- 右對齊 — 文字的左邊界
y對應(yīng)的橫線并不是文字的下邊界,而是基準線Baseline
看下面這張圖
紅色的Baseline是基準線,紫色的Top是文字的最頂部,也就是在drawText()中指定的x所對應(yīng),橙色的Bottom是文字的底部。
拿這些值如何獲取呢?
Paint.FontMetrics fontMetrics=paint.getFontMetrics(); fontMetrics.top fontMetrics.ascent fontMetrics.descent fontMetrics.bottom
記得要在設(shè)置完P(guān)aint的文字大小,寬度之類屬性后再獲取FontMetrics,
baseline對應(yīng)對應(yīng)值為0,在它下面的descent和bottom值為正,top和ascent為負。那文字的高度為bottom - top
所以,實際繪制的時候取決于基線上一個點來繪制文字,而這個點有三種分別對應(yīng)為left,center,right
好啦,把drawText()中x,y參數(shù)講清楚后實現(xiàn)文字居中就很容易了
直接上代碼
//矩形背景 Paint bgRect=new Paint(); bgRect.setStyle(Paint.Style.FILL); bgRect.setColor(Color.YELLOW); RectF rectF=new RectF(200, 200, 800, 600); canvas.drawRect(rectF, bgRect); Paint textPaint=new Paint(); textPaint.setStyle(Paint.Style.FILL); textPaint.setStrokeWidth(8); textPaint.setTextSize(50); textPaint.setTextAlign(Paint.Align.CENTER); String text="測試:my text"; //計算baseline Paint.FontMetrics fontMetrics=textPaint.getFontMetrics(); float distance=(fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom; float baseline=rectF.centerY()+distance; canvas.drawText(text, rectF.centerX(), baseline, textPaint);
效果
將對齊方式設(shè)置為center,那要讓文字居中顯示,x值就為矩形中心x值,y值也就是baseline的計算看下圖
y = 矩形中心y值 + 矩形中心與基線的距離
距離 = 文字高度的一半 - 基線到文字底部的距離(也就是bottom) = (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支持。
上一篇:Android實現(xiàn)圖片一邊的三角形邊框效果
欄 目:Android
下一篇:flutter 自定義websocket路由的實現(xiàn)
本文標題:Android Canvas的drawText()與文字居中方案詳解
本文地址:http://mengdiqiu.com.cn/a1/Android/9007.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應(yīng)用實現(xiàn)方法詳解
- 01-10android實現(xiàn)記住用戶名和密碼以及自動登錄
- 01-10android實現(xiàn)簡單計算器功能
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代碼
- 01-10android實現(xiàn)指紋識別功能
- 01-10Emoji表情在Android JNI中的兼容性問題詳解
- 01-10Android實現(xiàn)圓形漸變加載進度條
- 01-10android開發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解
- 01-10android異步消息機制 源碼層面徹底解析(1)


閱讀排行
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應(yīng)用實現(xiàn)方
- 01-10android實現(xiàn)簡單計算器功能
- 01-10android實現(xiàn)記住用戶名和密碼以及自動
- 01-10C++自定義API函數(shù)實現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代
- 01-10android實現(xiàn)指紋識別功能
- 01-10如何給Flutter界面切換實現(xiàn)點特效
- 01-10Android實現(xiàn)圓形漸變加載進度條
- 01-10Emoji表情在Android JNI中的兼容性問題詳
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結(jié)