這是 JsonChao 的第241期分享
前言很高興遇見你~
在本系列的上一篇文章中,我們對 Typeface 進行了深入的解析,還沒有看過上一篇文章的朋友,建議先去閱讀
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開發必備的知識體系
歡迎把文章分享到朋友圈