Android 字體高度的研究

原文:https://blog.csdn.net/uyy203/article/details/54926753

Android自定義View繪制的時候,會有很多情況下要與字體打交道拼岳,涉及到字體寬度害捕、高度的時候要特別注意一下幾個概念别厘,見圖:


image.png

baseLine:一行文字的底線。

Ascent: 字符頂部到baseLine的距離。

Descent: 字符底部到baseLine的距離屯断。

Leading: 字符行間距脱拼。

public class TestOnDraw extends Activity {   
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {   
        // TODO Auto-generated method stub   
        super.onCreate(savedInstanceState);   
        MyView v = new MyView(this);   
        this.setContentView(v);   
    }   
}   
  
class MyView extends View   
{   
  
    public MyView(Context context) {   
        super(context);   
    }   
    @Override  
    protected void onDraw(Canvas canvas) {   
        super.onDraw(canvas);   
           
        Paint p = new Paint();   
        p.setColor(Color.WHITE);   
        p.setTextSize(50);   
        p.setAntiAlias(true);   
        FontMetrics fm = p.getFontMetrics();   
           
        System.out.println("top = "+ fm.top);   
        System.out.println("ascent = "+ fm.ascent);   
        System.out.println("descent = "+ fm.descent);   
        System.out.println("bottom = "+ fm.bottom);   
        System.out.println("leading = "+ fm.leading);   
           
        int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2);   
        System.out.println("textHeight = "  + textHeight);   
           
        float width =500;   
        float baseline = 100f;   
        float offsetAscent = baseline + fm.ascent;   
        float offsetDescent = baseline +fm.descent;   
        float offsetTop = baseline + fm.top;   
        float offsetBottom = baseline + fm.bottom;   
           
        canvas.drawText("中國 bp Android", 0, baseline, p);   
           
        canvas.drawLine(0, baseline, width, baseline, p);//baseline   
        canvas.drawLine(0, offsetAscent, width, offsetAscent, p);//ascent   
        canvas.drawLine(0, offsetDescent, width, offsetDescent, p);//descent   
        canvas.drawLine(0, offsetTop, width, offsetTop, p);//top   
        canvas.drawLine(0, offsetBotton, width, offsetBottom, p);//bottom   
    }   
}  
public class TestOnDraw extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
        MyView v = new MyView(this);  
        this.setContentView(v);  
    }  
}  
  
class MyView extends View  
{  
  
    public MyView(Context context) {  
        super(context);  
    }  
    @Override  
    protected void onDraw(Canvas canvas) {  
        super.onDraw(canvas);  
          
        Paint p = new Paint();  
        p.setColor(Color.WHITE);  
        p.setTextSize(50);  
        p.setAntiAlias(true);  
        FontMetrics fm = p.getFontMetrics();  
          
        System.out.println("top = "+ fm.top);  
        System.out.println("ascent = "+ fm.ascent);  
        System.out.println("descent = "+ fm.descent);  
        System.out.println("bottom = "+ fm.bottom);  
        System.out.println("leading = "+ fm.leading);  
          
        int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2);  
        System.out.println("textHeight = "  + textHeight);  
          
        float width =500;  
        float baseline = 100f;  
        float offsetAscent = baseline + fm.ascent;  
        float offsetDescent = baseline +fm.descent;  
        float offsetTop = baseline + fm.top;  
        float offsetBottom = baseline + fm.bottom;  
          
        canvas.drawText("中國 bp Android", 0, baseline, p);  
          
        canvas.drawLine(0, baseline, width, baseline, p);//baseline  
        canvas.drawLine(0, offsetAscent, width, offsetAscent, p);//ascent  
        canvas.drawLine(0, offsetDescent, width, offsetDescent, p);//descent  
        canvas.drawLine(0, offsetTop, width, offsetTop, p);//top  
        canvas.drawLine(0, offsetBotton, width, offsetBottom, p);//bottom  
    }  
}  

運(yùn)行效果:


image.png

這是程序的輸出結(jié)果:


image.png

得出結(jié)論: canvas drawText() 的startX是從左下角的baseline的底線開始繪畫的瞒瘸,如果我們要得到字體的高度需要關(guān)注descent - ascent (ascent線在baseline上面,所以是負(fù)數(shù))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熄浓,一起剝皮案震驚了整個濱河市情臭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赌蔑,老刑警劉巖俯在,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娃惯,居然都是意外死亡跷乐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門趾浅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愕提,“玉大人,你說我怎么就攤上這事潮孽【救伲” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵往史,是天一觀的道長仗颈。 經(jīng)常有香客問我,道長椎例,這世上最難降的妖魔是什么挨决? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮订歪,結(jié)果婚禮上脖祈,老公的妹妹穿的比我還像新娘。我一直安慰自己刷晋,他們只是感情好盖高,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布慎陵。 她就那樣靜靜地躺著,像睡著了一般喻奥。 火紅的嫁衣襯著肌膚如雪席纽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天撞蚕,我揣著相機(jī)與錄音润梯,去河邊找鬼。 笑死甥厦,一個胖子當(dāng)著我的面吹牛纺铭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刀疙,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼舶赔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庙洼?” 一聲冷哼從身側(cè)響起顿痪,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎油够,沒想到半個月后蚁袭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡石咬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年揩悄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鬼悠。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡删性,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焕窝,到底是詐尸還是另有隱情蹬挺,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布它掂,位于F島的核電站巴帮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虐秋。R本人自食惡果不足惜榕茧,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望客给。 院中可真熱鬧用押,春花似錦、人聲如沸靶剑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缎讼,卻和暖如春纵菌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背休涤。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留笛辟,地道東北人功氨。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像手幢,于是被迫代替她去往敵國和親捷凄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容