close

這是 JsonChao 的第241期分享

前言

很高興遇見你~

在本系列的上一篇文章中,我們對 Typeface 進行了深入的解析,還沒有看過上一篇文章的朋友,建議先去閱讀

Android字體系列 (二):Typeface完全解析
sweetying,公眾號:JsonChaoAndroid 字體系列 (二):Typeface 完全解析
一、Xml 中字體介紹

Google 在 Android Support Library 26 引入了 Xml 中設置字體這項新功能,它可以讓你將字體當成資源去使用,你可以在 res/font/ 文件夾中添加 font 文件,將字體捆綁為資源。這些字體會在 R 文件中編譯,可直接在 Android Studio 中使用,如:

@font/myfontR.font.myfont

注意:要使用 Xml 字體功能,需引入 Android Support Library 26 及更高版本且要在 Android 4.1 及更高版本的設備

二、使用步驟

1、右鍵點擊 res 文件夾,然後轉到 New > Android resource directory

2、在 Resource type 列表中,選擇 font,然後點擊 OK

3、在 font 文件夾中添加字體文件

關於字體,推薦兩個免費下載的網站

https://fonts.google.com/

https://www.1001freefonts.com/

添加之後就會生成 R.font.ma_shan_zhenng_regular 和 R.font.noto_sans_bold

4、雙擊字體文件可預覽當前字體

以上 4 個步驟完成後我們就可以在 Xml 中使用字體了

5、創建 font family

1)、右鍵點擊 font 文件夾,然後轉到 New > Font resource file。此時將顯示 New Resource File 窗口。

2)、輸入文件名,然後點擊 OK。新的字體資源 Xml 會在編輯器中打開。

3)、將各個字體文件、樣式和粗細屬性都封裝在 <font> 元素中。如下:

<?xmlversion="1.0"encoding="utf-8"?><font-familyxmlns:tools="http://schemas.android.com/tools"xmlns:android="http://schemas.android.com/apk/res/android"tools:ignore="UnusedAttribute"><fontandroid:fontStyle="normal"android:fontWeight="400"android:font="@font/ma_shan_zheng_regular"tools:ignore="UnusedAttribute"/><fontandroid:fontStyle="normal"android:fontWeight="400"android:font="@font/noto_sans_bold"/></font-family>

實踐發現使用 font family 存在一些坑:

1、例如我上面添加了兩個 font 標籤,這個時候在 Xml 裡面引用將不會有任何效果,而且設置的 fontStyle 等屬性不會生效。

2、當只添加了一個 font 標籤,此時字體會生效,但是設置的 fontStyle 等屬性還是不會生效

因此我們在使用的時候建議直接對字體資源進行引用,樣式粗細這些在進行單獨的設置

三、在 XML 布局中使用字體

直接在布局 Xml 中使用 fontFamily 屬性進行引用,如下圖:

四、在樣式中添加並使用字體

1、在 style.xml 中添加樣式

<stylename="customfontstyle"parent="Theme.ChangeDefaultFontDemo"><itemname="android:fontFamily">@font/noto_sans_bold</item></style>

2、在布局 Xml 中使用,如下圖:

五、在代碼中使用字體

在代碼中,我們可以通過 ResourcesCompat 或 Resource 的 gontFont 方法拿到 Typeface 對象,然後調用相關的 Api 去設置就行了,例如:

//方式1valtypeface=ResourcesCompat.getFont(context,R.font.myfont)//方式2valtypeface=resources.getFont(R.font.myfont)//設置字體textView.typeface=typeface

為了方便在代碼中使用,我們可以進行合理的封裝:

objectFontUtil{constvalNOTO_SANS_BOLD=R.font.noto_sans_boldconstvalMA_SHAN_ZHENG_REGULAR=R.font.ma_shan_zheng_regular/**緩存字體Map*/privatevalcacheTypeFaceMap:HashMap<Int,Typeface>=HashMap()/***設置NotoSanUIBold字體*/funsetNotoSanUIBold(mTextView:TextView){try{mTextView.typeface=getTypeface(NOTO_SANS_BOLD)}catch(e:Exception){e.printStackTrace()}}/***設置MaShanZhengRegular字體*/funsetMaShanZhengRegular(mTextView:TextView){try{mTextView.typeface=getTypeface(MA_SHAN_ZHENG_REGULAR)}catch(e:Exception){e.printStackTrace()}}/***獲取字體Typeface對象*/fungetTypeface(fontResName:Int):Typeface?{valcacheTypeface=cacheTypeFaceMap[fontResName]if(cacheTypeface!=null){returncacheTypeface}returntry{valtypeface:Typeface?=ResourcesCompat.getFont(MyApplication.mApplication,fontResName)cacheTypeFaceMap[fontResName]=typeface!!typeface}catch(e:Exception){e.printStackTrace()Typeface.DEFAULT}}}

那麼後續我們在代碼中使用字體,就只需調一行代碼就 Ok 了

FontUtil.setMaShanZhengRegular(mTextView1)FontUtil.setNotoSanUIBold(mTextView2)六、項目需求實踐

回顧一下我接到的項目需求:全局替換當前項目中的默認字體,並引入 UI 設計師提供的一些新字體

在學習本篇文章之前,我們引入字體都是放在 assets 文件目錄下,這個目錄下的字體文件,我們只能在代碼中獲取並使用。那麼通過本篇文章的講解,我們不僅可以在代碼中進行使用,還可以在 Xml 中進行使用。現在我們解決了一半的需求,關於全局替換默認字體還需等到下一篇文章😄

七、總結

回顧下本篇文章我們講的一些重點內容:

1、將字體放在 res 的 font 目錄下 ,這樣我們就可以在 Xml 中使用字體了

2、通過字體 R 資源索引獲取字體文件,封裝相應的字體工具類,在代碼中優雅的使用

好了,本篇文章到這裡就結束了,希望能給你帶來幫助 🤝

Github Demo 地址:https://github.com/sweetying520/ChangeDefaultFontDemo

END


往期推薦



聊聊職場中最重要的兩個核心能力

你真的會休息嗎?如何開始正確的休息?

國慶返工日,捲起來!

如何系統構建你的思維認知模型?

如何從零到一掌控習慣?

那兩年沉澱的時間增值心法

Android 技術面試如何做好準備?

點擊下方卡片關注JsonChao,為你構建一套

未來技術人必備的底層能力系統


▲點擊上方卡片關注JsonChao,構建一套

未來Android開發必備的知識體系

歡迎把文章分享到朋友圈

年度成長社群

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()