Android 字體使用踩坑指南

Android 字體使用踩坑指南

最近項(xiàng)目改版,根據(jù)ui的設(shè)計(jì),需要使用到三字體。在使用過(guò)程中遇到一些坑,于是有了這個(gè)避坑指南!

字體壓縮

第一個(gè)坑!字體庫(kù)的體積太大。
字體壓縮的前提是要使用的內(nèi)容是可控的,換句話說(shuō),使用字體的文本時(shí)一些固定的內(nèi)容,比如說(shuō)金額,姓氏,顏色之類的!壓縮的原理是只提取要顯示的文本內(nèi)容,然后打包成字體包!這里我用到的是一個(gè)工具包,附上現(xiàn)在鏈接下載鏈接。具體的使用步驟見(jiàn)上面鏈接,可以有效的減少字體庫(kù)的體積!

使用字體庫(kù)方法一

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


    放置目錄
  • 加載字體庫(kù)

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

第二個(gè)坑,assets 目錄加載不到!
這是最常見(jiàn)的用法,但是由于某些特殊的原因,assets 目錄加載不到,那就用到另外一種方式

使用字體庫(kù)方法二

  • 放置字體庫(kù)
    在 res 目錄下新建一個(gè) font 的目錄


    放置目錄二

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

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

第三個(gè)坑,v4包的版本太低,切不能升級(jí)!
這種方式也又一個(gè)缺陷,就是 ResourcesCompat.getFont 這個(gè)函數(shù)是在android-support-v4這個(gè)包的版本是26+,才可以使用!這個(gè)就是遇到的第二個(gè)坑!這兩種方式的都失敗了,于是采用第三種方法!

使用字體庫(kù)方法三

由于前兩種方法都失敗了,所以有了這種方法!辦法總比空難多。先說(shuō)原理查看 Typeface 這個(gè)類有一個(gè)函數(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);
    }

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

  • 寫入文件
private Typeface copyTextTypeToFile() {

        File filesDir = mContext.getFilesDir();
        File puhuitiMiniPath = new File(filesDir, "orange.ttf");
                //判斷該文件存不存在
        if (!puhuitiMiniPath.exists()) {
                //如果不存在,開(kāi)始寫入文件
            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.建立通道對(duì)象
                FileOutputStream fos = new FileOutputStream(file);
                // 2.定義存儲(chǔ)空間
                byte[] buffer = new byte[inputStream.available()];
                // 3.開(kāi)始讀文件
                int lenght = 0;
                while ((lenght = inputStream.read(buffer)) != -1) {// 循環(huán)從輸入流讀取buffer字節(jié)
                    // 將Buffer中的數(shù)據(jù)寫到outputStream對(duì)象中
                    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)

這里只是說(shuō)明一下主要的實(shí)現(xiàn)思路,具體實(shí)現(xiàn)需要結(jié)合實(shí)際的場(chǎng)景!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容