Android 自定義字體孵运,更換系統(tǒng)默認(rèn)顯示的字體使用自定義字體

我的簡(jiǎn)書:http://www.reibang.com/u/c91e642c4d90
我的CSDN:http://blog.csdn.net/wo_ha
我的GitHub:https://github.com/chuanqiLjp
轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/282716d73c6a

序言:

可以免費(fèi)下載字體的網(wǎng)站:字體下載大寶庫(kù)溉仑;找字網(wǎng)
還有一個(gè)字體編輯軟件:FontCreator9.0綠色漢化特別版
可以自定義字體的第三方庫(kù):Calligraphy

1休雌、指定控件顯示指定字體

有時(shí)為了美化UI彰居,需要在指定控件中顯示特定的字體要销,而這個(gè)字體在Android系統(tǒng)中卻沒有,此時(shí)可將需要的字體文件存放在assets文件夾中嘉熊,在為控件設(shè)置Typeface :View.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/Nsimsun.ttf"))或View.setTypeface(Typeface.createFromFile(File))遥赚,如果軟件中多次使用可自定義View簡(jiǎn)化使用流程;

注意

如果有多處使用這個(gè)字體文件阐肤,如果在每次調(diào)用的時(shí)候都這樣寫凫佛,會(huì)造成每次執(zhí)行的時(shí)候都會(huì)重新加載一次該字體,導(dǎo)致內(nèi)存不斷變大泽腮,造成內(nèi)存泄漏御蒲。其解決方案是將加載的字體文件Typeface定義為一個(gè)常量,需要的時(shí)候拿來(lái)用就行了诊赊!

        <!--
        修改顯示的字體
        android:typeface="normal(正常)|sans(無(wú))|monospace(等寬字體)|serif(襯線)"
        -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:gravity="center"
            android:text="默認(rèn)的字體 sans —>李?"
            android:textAllCaps="false"
            android:textSize="30sp"
            android:typeface="serif"/>

        <TextView
            android:id="@+id/id_ywsflsjtForView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:gravity="center"
            android:text="1厚满、指定控件顯示指定字體—>禹衛(wèi)書法隸書簡(jiǎn)體的字體—>李?"
            android:textAllCaps="false"
            android:textSize="30sp"/>

        <TextView
            android:id="@+id/id_NsimsunForView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:gravity="center"
            android:text="1、指定控件顯示指定字體(解決部分字無(wú)法顯示)—>Nsimsun的字體—>李?"
            android:textAllCaps="false"
            android:textSize="30sp"/>
        //1碧磅、指定控件顯示指定字體
        tvYwsflsjtForView = (TextView) findViewById(R.id.id_ywsflsjtForView);
        tvYwsflsjtForView.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/ywsflsjt.ttf"));//禹衛(wèi)書法隸書簡(jiǎn)體的字體
        //1碘箍、指定控件顯示指定字體(解決部分字無(wú)法顯示)
        tvNsimsunForView = (TextView) findViewById(R.id.id_NsimsunForView);
        tvNsimsunForView.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/Nsimsun.ttf"));

2、整個(gè)軟件顯示指定字體

當(dāng)整個(gè)軟件都需要使用自定義字體鲸郊,我們就需要對(duì)全部顯示的控件字體進(jìn)行自定義丰榴,如果再使用1中的方法難免顯得麻煩,此時(shí)需要自定義Application秆撮,在程序剛啟動(dòng)的使用進(jìn)行系統(tǒng)中
Typeface類的字體變量的引用替換(就是某一字體變量原來(lái)引用系統(tǒng)的某一字體如:MONOSPACE四濒,現(xiàn)在將該變量的引用指向我們自定義的字體如:/assets/fonts/Nsimsun.ttf),從而實(shí)現(xiàn)整個(gè)軟件的字體自定義的過(guò)程职辨,這里由于系統(tǒng)沒有提供相關(guān)方法盗蟆,我們采用反射進(jìn)行實(shí)現(xiàn)。但是需要值得注意的是需要替換的字體變量名也需要在AppTheme進(jìn)行聲明:<item name="android:typeface">serif</item>舒裤,替換后有效果的字體變量名有:MONOSPACE喳资、SERIF,Aandroid 5.0及以上我們反射修改Typeface.sSystemFontMap變量的值腾供;
另一種方式是遞歸遍歷所有的View然后進(jìn)行替換仆邓,但是工作量還是不小,不推薦伴鳖。

        <TextView
            android:id="@+id/id_ywsflsjtForAPP"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:gravity="center"
            android:text="2节值、整個(gè)軟件顯示指定字體—>禹衛(wèi)書法隸書簡(jiǎn)體的字體—>李?(代碼在Application中)"
            android:textAllCaps="false"
            android:textSize="30sp"/>

        <TextView
            android:id="@+id/id_NsimsunForAPP"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:gravity="center"
            android:text="2、整個(gè)軟件顯示指定字體(解決部分字無(wú)法顯示)—>Nsimsun的字體—>李?(代碼在Application中)"
            android:textAllCaps="false"
            android:textSize="30sp"/>

在AndroidMainfest文件的application節(jié)點(diǎn)的的字段 theme的值引用的AppTheme文件中新增節(jié)點(diǎn),

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:typeface">serif</item>
    </style>

新增Application文件并在AndroidMainfest文件中引用

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //替換整個(gè)APP中沒有自定義字體的控件的顯示字體黎侈,即該軟件顯示指定字體
//        MyApplication.replaceFont(this, "MONOSPACE", "fonts/ywsflsjt.ttf");  // OK 察署,需要與<item name="android:typeface">monospace</item> 的值對(duì)應(yīng)
//        MyApplication.replaceFont(this, "NORMAL", "fonts/ywsflsjt.ttf"); // 程序無(wú)法運(yùn)行
//        MyApplication.replaceFont(this, "SANS", "fonts/ywsflsjt.ttf"); // 可以運(yùn)行,但是顯示字體沒有修改成功
        MyApplication.replaceFont(this, "SERIF", "fonts/ywsflsjt.ttf"); // OK,需要與<item name="android:typeface">serif</item> 的值對(duì)應(yīng)
//        MyApplication.replaceFont(this, "SERIF", "fonts/Nsimsun.ttf"); //整個(gè)軟件顯示指定字體(解決部分字無(wú)法顯示)

    }

    /**
     * 替換字體峻汉,其本質(zhì)是將系統(tǒng)底層的字體變量進(jìn)行替換自己的字體引用 ,
     * 只會(huì)替換控件中沒有自定義字體的控件贴汪,已自定義的就是使用的是自定義的字體
     *
     * @param context
     * @param oldFontName            支持的名稱有 MONOSPACE脐往、SERIF,NORMAL(程序無(wú)法運(yùn)行)扳埂、SANS與DEFAULT和DEFAULT_BOLD與SANS_SERIF(可以運(yùn)行但是顯示字體沒有修改成功)
     *                              而且需要與 需要與AndroidManifest文件application節(jié)點(diǎn)的android:theme引用的styles文件中
     *                              <item name="android:typeface">monospace</item> 的值對(duì)應(yīng)
     * @param newFontNameFromAssets 新的字體路徑业簿,必須要放在assets文件夾下,如:fonts/Nsimsun.ttf
     */
    public static void replaceFont(Context context, String oldFontName, String newFontNameFromAssets) {
        Typeface newTypeface = Typeface.createFromAsset(context.getAssets(), newFontNameFromAssets);
        try {
            //android 5.0及以上我們反射修改Typeface.sSystemFontMap變量
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Map<String, Typeface> newMap = new HashMap<>();
                newMap.put(oldFontName, newTypeface);
                final Field staticField = Typeface.class.getDeclaredField("sSystemFontMap");
                staticField.setAccessible(true);
                staticField.set(null, newMap);
            } else {
                final Field staticField = Typeface.class.getDeclaredField(oldFontName);
                staticField.setAccessible(true);
                staticField.set(null, newTypeface);
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3阳懂、修改整個(gè)系統(tǒng)的默認(rèn)字體

請(qǐng)參考我的另一篇文章:Android更換系統(tǒng)默認(rèn)顯示的字體使用自定義字體

4梅尤、WebView加載指定字體(在獲取到網(wǎng)頁(yè)內(nèi)容后追加內(nèi)容)

1.系統(tǒng)中已有字體文件的字體

在需要顯示的范圍標(biāo)簽內(nèi)中添加 style="font-family:NSimSun;" ,如需要正文全部顯示為該字體則可以在標(biāo)簽<html后添加:<html style="font-family:NSimSun;"> 岩调,系統(tǒng)的字體文件路徑:/system/fonts/巷燥;

2.引用自定義的字體文件

將需要用到的字體放在assets文件中,在<head標(biāo)簽中增加一個(gè)style号枕,內(nèi)容如下:

    <head>
    <style>
         @font-face {
             font-family: 'MyWebFont';
             src:url('fonts/Nsimsun.ttf') format('truetype');
             font-weight: normal;
             font-style: normal;
         }
    </style>
    </head>

在需要的標(biāo)簽中添加style缰揪,如:<body style="font-family:MyWebFont;">

上面是使用內(nèi)聯(lián)的CSS,如果字體文件較多葱淳,可將CSS文件單獨(dú)分離出來(lái)钝腺,新建一個(gè)MyFonts.css的文件,內(nèi)容為:

@font-face {
    font-family: 'MyWebFont';
    src:url('fonts/Nsimsun.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}
/*多個(gè)文件依次往下排列*/
@font-face {
    font-family: 'MyWebFont2';
    src:url('fonts/ywsflsjt.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}

注意赞厕,這個(gè)就不用包含在style標(biāo)簽中了艳狐,在新建一個(gè)bodyFont.css的文件,內(nèi)容為:

body {
    font-family:'MyWebFont2'; /*為body部分MyFonts.css文件中的MyWebFont2中聲明的ywsflsjt字體*/
}

然后在head標(biāo)簽中添加內(nèi)容:

<head>
<link href="file:///android_asset/MyFonts.css" rel="stylesheet" type="text/css"/>
<link href="file:///android_asset/bodyFont.css" rel="stylesheet" type="text/css"/>
</head>

更多參考:

  • Android 字體修改,所有的細(xì)節(jié)都在這里 系列【想深入研究強(qiáng)烈推薦】

Android 字體修改诲侮,所有的細(xì)節(jié)都在這里 | 開篇
Android 修改字體蒜茴,跳不過(guò)的 Typeface
粗暴的方式,替換全局字體
全局修改默認(rèn)字體浆西,通過(guò)反射也能做到
利用 AppCompatDelegate ,半小時(shí)就能在成熟項(xiàng)目上全局替換字體!
通過(guò)修改 LayoutInflater顽腾,全局替換字體=恪!抄肖!
設(shè)計(jì)師說(shuō)久信,我們要在 App 里用十種字體!@炷Α裙士!
Android Oreo 可下載字體
全局替換字體,開源庫(kù)更方便9鼙小M茸怠桌硫!
看完九篇字體系列的文章,你還覺得我是在說(shuō)字體啃炸?

我的CSDN博客:http://blog.csdn.net/wo_ha/article/details/79193141

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铆隘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子南用,更是在濱河造成了極大的恐慌膀钠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裹虫,死亡現(xiàn)場(chǎng)離奇詭異肿嘲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)筑公,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門雳窟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人十酣,你說(shuō)我怎么就攤上這事涩拙。” “怎么了耸采?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵兴泥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我虾宇,道長(zhǎng)搓彻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任嘱朽,我火速辦了婚禮旭贬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搪泳。我一直安慰自己稀轨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布岸军。 她就那樣靜靜地躺著奋刽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艰赞。 梳的紋絲不亂的頭發(fā)上佣谐,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音方妖,去河邊找鬼狭魂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雌澄。 我是一名探鬼主播斋泄,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掷伙!你這毒婦竟也來(lái)了是己?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤任柜,失蹤者是張志新(化名)和其女友劉穎卒废,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宙地,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摔认,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宅粥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片参袱。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秽梅,靈堂內(nèi)的尸體忽然破棺而出抹蚀,到底是詐尸還是另有隱情,我是刑警寧澤企垦,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布环壤,位于F島的核電站,受9級(jí)特大地震影響钞诡,放射性物質(zhì)發(fā)生泄漏郑现。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一荧降、第九天 我趴在偏房一處隱蔽的房頂上張望接箫。 院中可真熱鬧,春花似錦朵诫、人聲如沸辛友。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞎领。三九已至,卻和暖如春随夸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背震放。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工宾毒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殿遂。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓诈铛,卻偏偏與公主長(zhǎng)得像乙各,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幢竹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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