Android 字體使用踩坑指南

Android 字體使用踩坑指南

最近項目改版,根據(jù)ui的設(shè)計后裸,需要使用到三字體瑰钮。在使用過程中遇到一些坑,于是有了這個避坑指南轻抱!

字體壓縮

第一個坑!字體庫的體積太大飞涂。
字體壓縮的前提是要使用的內(nèi)容是可控的,換句話說祈搜,使用字體的文本時一些固定的內(nèi)容较店,比如說金額,姓氏,顏色之類的容燕!壓縮的原理是只提取要顯示的文本內(nèi)容梁呈,然后打包成字體包!這里我用到的是一個工具包蘸秘,附上現(xiàn)在鏈接下載鏈接官卡。具體的使用步驟見上面鏈接蝗茁,可以有效的減少字體庫的體積!

使用字體庫方法一

  • 準(zhǔn)備好的要用的字體放在如下目錄


    放置目錄
  • 加載字體庫

TextView textView= (TextView) findViewById(R.id.text_view); 
Typeface typeface=Typeface.createFromAsset(getAssets(),"fonts/orange.ttf"); 
textView.setTypeface(typeface);

第二個坑寻咒,assets 目錄加載不到哮翘!
這是最常見的用法,但是由于某些特殊的原因毛秘,assets 目錄加載不到饭寺,那就用到另外一種方式

使用字體庫方法二

  • 放置字體庫
    在 res 目錄下新建一個 font 的目錄


    放置目錄二

然后將字體庫文件放進(jìn)新建的font 文件下。

  • 加載字體庫
    TextView textView = (TextView) findViewById(R.id.text_view);
    Typeface typeface = ResourcesCompat.getFont(this, R.font.orange);
    textView.setTypeface(typeface);

第三個坑叫挟,v4包的版本太低艰匙,切不能升級!
這種方式也又一個缺陷抹恳,就是 ResourcesCompat.getFont 這個函數(shù)是在android-support-v4這個包的版本是26+员凝,才可以使用!這個就是遇到的第二個坑奋献!這兩種方式的都失敗了健霹,于是采用第三種方法!

使用字體庫方法三

由于前兩種方法都失敗了秽荞,所以有了這種方法骤公!辦法總比空難多。先說原理查看 Typeface 這個類有一個函數(shù)

 /**
     * Create a new typeface from the specified font file.
     *
     * @param path The full path to the font data.
     * @return The new typeface.
     */
    public static Typeface createFromFile(String path) {
        if (sFallbackFonts != null) {
            FontFamily fontFamily = new FontFamily();
            if (fontFamily.addFont(path, 0 /* ttcIndex */)) {
                FontFamily[] families = { fontFamily };
                return createFromFamiliesWithDefault(families);
            }
        }
        throw new RuntimeException("Font not found " + path);
    }

這個函數(shù)允許從一個文件路徑加載字體庫扬跋,于是采用這種方法!我們在res目錄下新建一個 raw目錄凌节,然后把字體文件放進(jìn)去钦听!我們需要被這個文件寫入手機(jī)的內(nèi)存中,然后從內(nèi)存再加載這個文件倍奢!寫入文件的路徑選擇這個 /data/data/packagename/files/目錄下朴上,目的就是為了避開權(quán)限sdcard 的讀寫權(quán)限檢查!

  • 寫入文件
private Typeface copyTextTypeToFile() {

        File filesDir = mContext.getFilesDir();
        File puhuitiMiniPath = new File(filesDir, "orange.ttf");
                //判斷該文件存不存在
        if (!puhuitiMiniPath.exists()) {
                //如果不存在卒煞,開始寫入文件
            copyFilesFromRaw(mContext, R.raw.orange, "orange.ttf", mContext.getFilesDir().getAbsolutePath());
        }
        return Typeface.createFromFile(puhuitiMiniPath);
    }


        ...

 void copyFilesFromRaw(Context context, int id, String fileName,String storagePath){
        InputStream inputStream=context.getResources().openRawResource(id);
        File file = new File(storagePath);
        //如果文件夾不存在痪宰,則創(chuàng)建新的文件夾
        if (!file.exists()) {
            file.mkdirs();
        }


        String storagePath = storagePath + SEPARATOR + fileName;
     
         File file = new File(storagePath);
        try {
            if (!file.exists()) {
                // 1.建立通道對象
                FileOutputStream fos = new FileOutputStream(file);
                // 2.定義存儲空間
                byte[] buffer = new byte[inputStream.available()];
                // 3.開始讀文件
                int lenght = 0;
                while ((lenght = inputStream.read(buffer)) != -1) {// 循環(huán)從輸入流讀取buffer字節(jié)
                    // 將Buffer中的數(shù)據(jù)寫到outputStream對象中
                    fos.write(buffer, 0, lenght);
                }
                fos.flush();// 刷新緩沖區(qū)
                // 4.關(guān)閉流
                fos.close();
                inputStream.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

將文件寫入之后加載

textView.setTypeface(typeface)

這里只是說明一下主要的實現(xiàn)思路,具體實現(xiàn)需要結(jié)合實際的場景畔裕!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衣撬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扮饶,更是在濱河造成了極大的恐慌具练,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甜无,死亡現(xiàn)場離奇詭異扛点,居然都是意外死亡哥遮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門陵究,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眠饮,“玉大人,你說我怎么就攤上這事铜邮∫钦伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵牲距,是天一觀的道長返咱。 經(jīng)常有香客問我,道長牍鞠,這世上最難降的妖魔是什么咖摹? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮难述,結(jié)果婚禮上萤晴,老公的妹妹穿的比我還像新娘。我一直安慰自己胁后,他們只是感情好店读,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著攀芯,像睡著了一般屯断。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侣诺,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天殖演,我揣著相機(jī)與錄音,去河邊找鬼年鸳。 笑死趴久,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搔确。 我是一名探鬼主播彼棍,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膳算!你這毒婦竟也來了座硕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤畦幢,失蹤者是張志新(化名)和其女友劉穎坎吻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宇葱,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瘦真,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年刊头,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诸尽。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡原杂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出您机,到底是詐尸還是另有隱情穿肄,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布际看,位于F島的核電站咸产,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仲闽。R本人自食惡果不足惜脑溢,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赖欣。 院中可真熱鬧屑彻,春花似錦、人聲如沸顶吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悴了。三九已至搏恤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湃交,已是汗流浹背挑社。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留巡揍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓菌瘪,卻偏偏與公主長得像腮敌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俏扩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,092評論 1 32
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時糜工,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,256評論 0 9
  • feisky云計算录淡、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,827評論 0 5
  • WinRAR - 最新版本的更新 版本 5.50 1. WinRAR 和命令行 RAR 默認(rèn)使用 RAR ...
    王舒璇閱讀 2,379評論 0 2
  • 一捌木、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,725評論 0 10