Android使用FontMetrics對象計算位置坐標(biāo)
Canvas繪制文本時,使用FontMetrics對象,計算位置的坐標(biāo)。
public static class FontMetrics { /** * The maximum distance above the baseline for the tallest glyph in * the font at a given text size. */ public float top; /** * The recommended distance above the baseline for singled spaced text. */ public float ascent; /** * The recommended distance below the baseline for singled spaced text. */ public float descent; /** * The maximum distance below the baseline for the lowest glyph in * the font at a given text size. */ public float bottom; /** * The recommended additional space to add between lines of text. */ public float leading; }
它的各基準(zhǔn)線可以參考下圖:
上圖其實是通過代碼畫出來的,具體代碼如下:
/** 繪制FontMetrics對象的各種線 */ mPaint.reset(); mPaint.setColor(Color.WHITE); mPaint.setTextSize(80); // FontMetrics對象 FontMetrics fontMetrics = mPaint.getFontMetrics(); String text = "abcdefg"; // 計算每一個坐標(biāo) float textWidth = mPaint.measureText(text); float baseX = 30; float baseY = 700; float topY = baseY + fontMetrics.top; float ascentY = baseY + fontMetrics.ascent; float descentY = baseY + fontMetrics.descent; float bottomY = baseY + fontMetrics.bottom; // 繪制文本 canvas.drawText(text, baseX, baseY, mPaint); // BaseLine描畫 mPaint.setColor(Color.RED); canvas.drawLine(baseX, baseY, baseX + textWidth, baseY, mPaint); mPaint.setTextSize(20); canvas.drawText("base", baseX + textWidth, baseY, mPaint); // Base描畫 canvas.drawCircle(baseX, baseY, 5, mPaint); // TopLine描畫 mPaint.setColor(Color.LTGRAY); canvas.drawLine(baseX, topY, baseX + textWidth, topY, mPaint); canvas.drawText("top", baseX + textWidth, topY, mPaint); // AscentLine描畫 mPaint.setColor(Color.GREEN); canvas.drawLine(baseX, ascentY, baseX + textWidth, ascentY, mPaint); canvas.drawText("ascent", baseX + textWidth, ascentY + 10, mPaint); // DescentLine描畫 mPaint.setColor(Color.YELLOW); canvas.drawLine(baseX, descentY, baseX + textWidth, descentY, mPaint); canvas.drawText("descent", baseX + textWidth, descentY, mPaint); // ButtomLine描畫 mPaint.setColor(Color.MAGENTA); canvas.drawLine(baseX, bottomY, baseX + textWidth, bottomY, mPaint); canvas.drawText("buttom", baseX + textWidth, bottomY + 10, mPaint);
相信通過以上程序,能夠很好的理解topLine,buttomLine,baseLine,ascentLine,descentLine。
另外:Paint類有兩個方法
/** * Return the distance above (negative) the baseline (ascent) based on the * current typeface and text size. * * @return the distance above (negative) the baseline (ascent) based on the * current typeface and text size. */ public native float ascent(); /** * Return the distance below (positive) the baseline (descent) based on the * current typeface and text size. * * @return the distance below (positive) the baseline (descent) based on * the current typeface and text size. */ public native float descent();
ascent():the distance above the baseline(baseline以上的height)
descent():the distance below the baseline(baseline以下的height)
所以ascent() + descent() 可以看成文字的height。
到此為止,怎么獲取文字的height和width都已經(jīng)揭曉了:
獲取height : mPaint.ascent() + mPaint.descent()
獲取width : mPaint.measureText(text)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android應(yīng)用開發(fā)中數(shù)據(jù)的保存方式總結(jié)
這篇文章主要介紹了Android應(yīng)用開發(fā)中數(shù)據(jù)的保存方式總結(jié),包括對ROM、SD卡、SharedPreference這三種方式實現(xiàn)的核心代碼的精選,需要的朋友可以參考下2016-02-02Anroid四大組件service之本地服務(wù)的示例代碼
本篇文章主要介紹了Anroid四大組件service之本地服務(wù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10android讀寫sd卡操作寫入數(shù)據(jù)讀取數(shù)據(jù)示例
這篇文章主要介紹了android讀寫sd卡操作,示例實現(xiàn)了寫入數(shù)據(jù)讀取數(shù)據(jù)的功能,大家參考使用吧2014-01-01ImageView簡單加載網(wǎng)絡(luò)圖片實例代碼
使用ImageView實現(xiàn)簡單加載網(wǎng)絡(luò)圖片的功能,示例代碼如下,感興趣的朋友可以參考下哈,希望對大家有所幫助2013-06-06Android 第三方應(yīng)用接入微信平臺研究情況分享(一)
微信平臺開放后倒是挺火的,許多第三方應(yīng)用都想試下接入微信這個平臺,畢竟可以利用微信建立起來的關(guān)系鏈來拓展自己的應(yīng)用還是挺不錯的 最近由于實習(xí)需要也在研究這個東西,這里把我的整個研究情況給出來2013-01-01Android實現(xiàn)捕獲TextView超鏈接的方法
這篇文章主要介紹了Android實現(xiàn)捕獲TextView超鏈接的方法,涉及Android查找TextView中超鏈接的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10