在開發(fā)工程師與設計師配合過程中,經(jīng)常會遇到的問題就是設計師提供設計圖陆爽,開發(fā)工程師嚴格按照設計圖開發(fā)完成扳缕,但結果就是無法做到設計稿完美還原,需要在后期進行視覺走查的過程中進行微調躯舔,占用開發(fā)時間,本著效率優(yōu)先丧失,尋找解決方案惜互,過程中也帶來了一些個人思考琳拭,在這里和大家分享一下描验。
原因探討
原因很簡單,其實用一張圖就可以解答清楚絮缅,但目前網(wǎng)上流傳的很多圖片本身就存在問題呼股,或者說沒有問題,原因我之后會說吸奴。
我們先來看一下Android Developer Document里對FontMetrics的介紹:
name | description |
---|---|
ascent | The recommended distance above the baseline for singled spaced text.(在單行文字里距離baseline之上推薦的距離) |
bottom | The maximum distance below the baseline for the lowest glyph in the font at a given text size.(距離baseline之下最大的距離) |
descent | The recommended distance below the baseline for singled spaced text. (在單行文字里距離baseline之下推薦的距離) |
leading | The recommended additional space to add between lines of text.(在行間距推薦的額外空間) |
top | The maximum distance above the baseline for the tallest glyph in the font at a given text size.(距離baseline之上最大的距離) |
然后看下目前關于FontMetrics使用比較廣的圖:
這張圖其實已經(jīng)很形象的展示了ascent奄抽、descent甩鳄、leading和hight的關系,貌似沒看到bottom和top妙啃,別急,接下來我們在Android里面把這5個參數(shù)畫出來馆匿,看圖:
從上往下分別是:top燥滑、ascent铭拧、baseline赃蛛、descent和bottom搀菩,leading一般都為0,我們可以看到歧蒋,ascent并沒有完全貼合在Apple上面,和設想中的并不一樣萝映,主要原因是Android里面的字體為了兼容更多的語言阐虚,留有特殊符號的空間,例如"??ü",所以圖一其實誤導了開發(fā)者敌呈,但說圖一大錯特錯其實也不對磕洪,我們可以在Typeface Wiki里面找到答案:
The ascent and descent may or may not include distance added by accents or diacritical marks.
這句話的意思就是ascent和descent有诫龙、或者沒有包含變音符。
關于FontMetrics的使用签赃,可以看下博文自定義控件其實很簡單1/4,寫的非常棒歹嘹,在這里我就不復述了孔庭,推薦大家去看下。
方案思考
OK怎抛,我們其實已經(jīng)找到原因了芽淡,但并沒有找到完美的解決方案,雖然Android心懷好意給我們考慮了變音符的空間挣菲,但對我們而言并沒有什么卵用,因為在平時開發(fā)中并用不到唉窃,而且這距離還無法準確計算纹笼,只給出了ascent和top,可以通過top-ascent(因為top和ascent都是負數(shù)蔓涧,計算是應該是ascent-top)來估算出上邊距,而通過bottom-descent來估算出下邊距元暴,如果還想要進一步精確茉盏,只能通過工具去測量得出了,風險是有些沒有考慮到的字體會出現(xiàn)不準確的情況鸠姨,這就要視具體情況而定了。
工具
了解情況之后连茧,我就開發(fā)了一個工具給設計師巍糯,讓她可以查看不同字體大小出現(xiàn)的上下邊距,如圖:
如果大家有更好的方法,歡迎交流討論惰聂,留下高見咱筛,謝謝!
參考資料
自定義控件其實很簡單1/4
Typeface Wiki
FontMetrics
Meaning of top, ascent, baseline, descent, bottom, and leading in Android's FontMetrics
可以隨意轉發(fā)迅箩,也歡迎關注我的簡書,我會堅持給大家?guī)矸窒怼?/p>