http://blog.chinaunix.net/uid-26926660-id-3325421.html
一。背景
盡量寫簡單一點這次就不廢話了。
二。分析
2.1.檔案系統中字型的位置:
/system/fonts/ 其中的ttf檔案都是字型檔對於源碼/frameworks/data/fonts/下的字型檔
DroidSans-Bold.ttf 粗體的無襯線字型(拉丁字母等)
DroidSans.ttf 常規的無襯線字型(拉丁字母等)
DroidSansFallback.ttf 常規的無襯線字型(中文字元等,一般換字型檔就是替換此檔案)
DroidSansMono.ttf 等寬的無襯線字型(拉丁字母等)
DroidSerif-Bold.ttf 粗體的襯線字型(拉丁字母等)
DroidSerif-BoldItalic.ttf 粗體+斜體的襯線字型(拉丁字母等)
DroidSerif-Italic.ttf 斜體的襯線字型(拉丁字母等)
DroidSerif-Regular.ttf 常規的襯線字型(拉丁字母等)
Clockopia.ttf (顯示數字時鐘時用的字型,非必須)
在frameworks/fonts/下有三個xml檔案,分別是fallback_fonts.xml、system_fonts.xml、vendor_fonts.xml,最終被編進系統的是前面兩個。
改變字型有不外乎兩種方法,一是強制替換掉系統的預設字型,也就是把你想要替換的字型重新命名成DroidSansFallback.ttf,替換掉/system/fonts/下原來的那個,另外一種方法就是通過定義vendor
fonts xml的方法來設定,對於我們來說,第一種方法太過於暴力,且沒有選擇的餘地。所以第二種方法更為可行
暴力替換法就不說了,現在說說廠商字型法:
2.2.vendor fonts方法:
假設你要添加一個XXXXX.ttf格式的字型檔:
按照android用例vendor_fonts.xml檔案中注釋介紹的方法,在/vendor/etc/目錄下建立一個fallback_fonts.xml,例如
<familyset> <family order="9"> <fileset> <file>XXXXX.ttf</file> </fileset> </family> </familyset> |
其中family order就表示描述的插入的vendor字型的需要代替的位置,即/system/etc/fallback_fonts.xml中描述的第10個family(從0開始),也就是DroidSansFallback.ttf,使用這種方法前也需要將“XXXXX.ttf”拷貝到/system/fonts下
三。總結:
這次也不廢話了,不過要提醒一下,字型檔大部分都是有著作權的,所以用別人的字型檔前都要小心,這也是為什麼Android不再Settings中添加字型的選擇欄的原因,如果你用了別人的字型檔沒有交保護費的話而產品又買了不少錢的話,呵呵,律師函估計已經在抵達的途中。
------------------------------------
修改安卓字型續篇:針對4.0(ICS)修改字型
http://www.douban.com/note/222712555/
此文是針對我去年日誌《網上的方法都過時了!一個字型搞定安卓英中日韓顯示,你懂的!》的追加。原文講的是2.x時代的字型檔用途,到了4.x(最新的4.1尚未測試,估計變化不大),中英文字型都有較大變動,需要寫一篇新的日誌說明下。
4.x以後最顯著的變化是新增了Roboto家族,有Regular/Bold/Italic/BoldItalic四種變體,相比原來的DroidSans多了兩個斜體。原來的DroidSans家族還在,但是已經被指向到Roboto家族,再修改原來的檔案是無效的。
由於中文字型至今未出現獨立斜體和獨立粗斜體,因此我在這裡建議大家中英文分開替換,這樣可以保證英文有斜體和粗斜體,同時中英文有更多種獨立搭配。
為了替換英文字型,我們需要準備四個字型(蠻多字型都有獨立斜體的,很容易找)分別替換以下四個檔案:
Roboto-Regular.ttf
Roboto-Italic.ttf
Roboto-Bold.ttf
Roboto-BoldItalic.ttf
更換的前期準備和操作要領見文首引用的那篇日誌。
針對中文,4.x還是一個DroidSansFallback.ttf完成。有的韌體可能是DroidSansFallbackFull.ttf一類名稱,總之體積最大的那個是我們需要替換的。個人是對字型要求比較高的,也喜歡針對中日韓文字使用獨立粗體,因此我針對獨立粗體又進行了探索,收穫見下。
用RootExplorer進入/System/etc目錄下可以找到fallback_fonts.xml這個檔案。這是4.x後對新增語種文字的設定檔,可以用記事本開啟進行修改。熟悉Linux的朋友會對這種檔案結構了如指掌,之中定義好了字型家族和不同的變體。我們可以發現,這裡中日韓還是一行如下的編碼:
<family>
<fileset>
<file>DroidSansFallback.ttf</file>
</fileset>
</family>
這就是說,系統沒有給我們準備好粗體。不必氣餒,我們發現檔案開頭有定義粗體的語句:
<family>
<fileset>
<file>DroidSansHebrew-Regular.ttf</file>
<file>DroidSansHebrew-Bold.ttf</file>
</fileset>
</family>
這是希伯來文,Google為它打造了獨立粗體。我們仿照上面的語句,在<file>DroidSansFallback.ttf</file>後面另起一行加入:
<file>DroidSansFallback-Bold.ttf</file>
儲存。把這個檔案用RootExplorer覆蓋掉原來目錄中同名檔案,設定好許可權。
然後把我們需要的中文的常規體和粗體分別命名為DroidSansFallback.ttf和DroidSansFallback-Bold.ttf,覆蓋掉原來的字型,並將覆蓋後的字型和新加入到的DroidSansFallback-Bold.ttf的許可權都如同我上一篇教程那樣修改。
這樣一番工作完成後可以重啟查看效果了,這樣保證了英文替換的同時中文新增了粗體,對於字型控們來說賞心悅目。
當然,上面的fallback_fonts.xml理論上可以無限增加字型家族。譬如我剛剛替換的字型只有中日文(蠻多字型沒有韓文),我在後面定義新的家族如DroidSansKorean.ttf和DroidSansKorean-Bold.ttf(隨便自己取名)然後新增字型理論上也是可以繼續fallback的,fallback的順序就是fallback_fonts.xml中上下順序決定。
囿於本人的手機可用空間太小就沒有嘗實驗證上面的假說,有興趣的網友可以自己試試。
效果和上一篇教程基本一致,就沒有插圖了,希望諒解。
----------------------------------------------
實際操作:
修改字模相關檔案後,都需要重啟機器,或者重啟android,即在adb shell中輸入stop;start。
1.根據網上資料,字模可以添加到DroidSansFallback.ttf中,理論上就在flash,air(基於air開發的apk)、網頁等地方顯示出來了。
實際上,非自造字都顯示不出來了。後來在/system/etc/fallback_fonts.xml中看到如下注釋:
<!-- Note: complex scripts (i.e. those requiring shaping in Harfbuzz) have a cumulative limit of 64k glyphs. Thus, if they are placed after the large fonts such as DroidSansFallback, they are likely to render incorrectly. Please use caution when putting fonts toward the end of the list. -->
大概意思是說字模檔案中的字模總數不能超過64K,並且在大字模檔案(比如DroidSansFallback.ttf)後面的字模檔案可能顯示不正常。
我們嘗試過把自造字模添加到DroidSansFallback.ttf,這導致檔案增加到8M多,原來只有4M多,結果很多文字顯示不出來。
這與直接刪除DroidSansFallback.ttf時的效果是一樣的。
2.基於上面的原因,改用小字模檔案,只包含自造字模,測驗用的自造字模檔案約1M。
增加檔案/vendor/etc/fallback_fonts.xml,格式參考/system/etc/fallback_fonts.xml,具體內容如下:
<?xml version="1.0" encoding="utf-8"?><familyset> <family order="14"> <fileset> <file>diy.ttf</file> </fileset> </family></familyset>
把字型檔diy.ttf push到/system/fonts/下面,order="14"是參考/system/etc/fallback_fonts.xml,保證順序在DroidSansFallback.ttf前面。
但測試結果還是不行,網頁,flash,air中的自造字模都顯示不了,不知道哪裡搞錯了,或者是系統不支援。
3.上面的方法不行,打算直接修改/system/etc/fallback_fonts.xml,在DroidSansFallback.ttf前面增加:
<family> <fileset> <file>diy.ttf</file> </fileset> </family> <family> <fileset> <file>DroidSansFallback.ttf</file> </fileset> </family>
同樣需要把diy.ttf push到/system/fonts/下面。此時,網頁、flash中的自造字可以正常顯示了,但air中自造字顯示不了。
4.把自造字模添加到Roboto-Regular.ttf:
把自造字模添加到/system/fonts/Roboto-Regular.ttf中,重啟機器,air、flash中的自造字看正常顯示了。但是網頁中的自造字顯示不了。
5.根據實驗結果,需要同時使用兩種方法:
a.添加字模檔案/system/fonts/diy.ttf,並相應修改/system/etc/fallback_fonts.xml;
b.把自造字模添加到/system/fonts/Roboto-Regular.ttf中。
這樣網頁、flash、air中都顯示正常的了。
其他知識:
系統字模必須放在/system/fonts/下面,需要使用的字模要配置到/system/etc/system_fonts.xml和/system/etc/fallback_fonts.xml中。
系統優先從system_fonts.xml中列出的字模中尋找字模,其次才是fallback_fonts.xml。
如果要求粗斜體也要顯示自造字,下面檔案中都要添加字模。
Roboto-Italic.ttf
Roboto-Light.ttf
Roboto-LightItalic.ttf
Roboto-Regular.ttf
Roboto-Thin.ttf
Roboto-ThinItalic.ttf
這次是在android4.2的機器上操作的,系統字模列表如下:
AndroidClock.ttfAndroidClock_Highlight.ttfAndroidClock_Solid.ttfAndroidEmoji.ttfAnjaliNewLipi-light.ttfClockopia.ttfDroidNaskh-Regular.ttfDroidNaskh-Regular-SystemUI.ttfDroidSansArmenian.ttfDroidSansDevanagari-Regular.ttfDroidSansEthiopic-Regular.ttfDroidSansFallback.ttfDroidSansGeorgian.ttfDroidSansHebrew-Bold.ttfDroidSansHebrew-Regular.ttfDroidSansMono.ttfDroidSansTamil-Bold.ttfDroidSansTamil-Regular.ttfDroidSansThai.ttfDroidSerif-Bold.ttfDroidSerif-BoldItalic.ttfDroidSerif-Italic.ttfDroidSerif-Regular.ttfLohit-Bengali.ttfLohit-Kannada.ttfLohit-Telugu.ttfMTLmr3m.ttfNanumGothic.ttfRoboto-Bold.ttfRoboto-BoldItalic.ttfRobotoCondensed-Bold.ttfRobotoCondensed-BoldItalic.ttfRobotoCondensed-Italic.ttfRobotoCondensed-Regular.ttfRoboto-Italic.ttfRoboto-Light.ttfRoboto-LightItalic.ttfRoboto-Regular.ttfRoboto-Thin.ttfRoboto-ThinItalic.ttf