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é)合實際的場景畔裕!