在 android 下使用自定義字型已經是乙個比較常見的需求了,最近也做了個比較深入的研究。
那麼按照慣例我又要出個一篇有關 android 修改字型相關的文章,但是寫下來發現內容還挺多的,所以我決定將它們拆分一下,分幾篇來詳細的講解。主要會是一些常用的替換字型的方案,最後還會介紹一些全域性替換的方案,當然也會包含最新的 『fonts in xml』的方案。
期待你持續關注。
本篇是本系列的第九篇,之前已經發布的文章,有興趣可以先看看。
之前已經介紹了很多種,快速、低入侵的替換全域性字型的方式。但是大多數情況下,我們需要實現的功能,一定已經有現成的實現方案。
這個開源替換字型庫就是 calligraphy:
既然是要接入開源庫來全域性替換字型,先來看看它可以實現的效果。
接下來,我們開始一步步整合它。
calligraphy 支援 gradle 和 jar 的接入方式,這裡使用 gradle 來接入。
calligraphy 支援的檔案,可以放在assets/
目錄下,當然,我們可以再在其中建立乙個資料夾來專門的存放字型檔案。
初始化主要是為了指定一些預設的配置,例如:預設字型、預設屬性值。
到這裡,就完成了 calligraphy 的配置了,我們只需要在 textview 中,通過屬性去使用它就好了,它配置的是我們字型檔案,在 assets 目錄下的路徑。
我們使用乙個開源庫,當然要理解它的原理才能放心使用在商業專案上,接下來,我們就來分析一下 calligraphy 的實現原理,看看和之前介紹的方式,有沒有什麼區別。
先來看看 calligraphy 的整體結構。
可以看到,它一共需要的類非常的少,算是乙個比較精簡的庫了,並且它並沒有重寫 textview ,所以應該是通過其它的方式來做到字型的替換的。
calligraphyconfig 使用 builder 的模式去初始化自己,可以看到這裡只是設定了一些配置項,並沒有實際的業務邏輯。
calligraphyconfig 初始化之後,就以靜態變數儲存起來,供其它地方使用,是一種單例的模式,但是並沒有考慮執行緒安全的問題。
既然 calligraphyconfig 沒有實際的邏輯,那麼接下去應該如何追蹤重要的**呢?
那麼,這裡的 layout_inflater_service 到底是什麼呢?
我想大家應該對 layoutinflater 不陌生,從 layout-xml 載入 view 的時候,都需要用到它,相信下面這段**,應該大家都不陌生。
再仔細看看layoutinflater.from()
方法的原始碼。
可以看到,這裡獲得 layoutinflater 物件的時候,用到的就是 layout_inflater_service。
它會取出我們自定義屬性上設定的值,然後設定到初始化好的 textview 上去。
到此就完成了 calligraphy 的主要邏輯追蹤,幾個核心技術點:
calligraphy 不需要重寫 textview 之類的控制項。
calligraphy 重寫了 layoutinflater 。
在 calligraphylayoutinflater 中,攔截我們需要的 textview 和其子類,對它們的字型替換成我們設定的字型。
當然,實際上,開源庫之所以可以流傳的比較廣,它還做了更多的細節處理,但是我們一般分析開源庫,只需要關心主線邏輯就可以了。
整體來說 calligraphy 沒有什麼大毛病,可以放心使用,當然如果你用了一些同樣依賴此原理的第三方庫,可能會有衝突,這個就只能具體問題具體分析了。
推薦閱讀:
點讚或者分享吧~
全域性替換字型,開源庫更方便!!!
在 android 下使用自定義字型已經是乙個比較常見的需求了,最近也做了個比較深入的研究。那麼按照慣例我又要出個一篇有關 android 修改字型相關的文章,但是寫下來發現內容還挺多的,所以我決定將它們拆分一下,分幾篇來詳細的講解。主要會是一些常用的替換字型的方案,最後還會介紹一些全域性替換的方案...
第三方開源庫 CircleImageView
沒有對進行優化,若過大,容易oom,drawable a.jpg是大。dependencies邊框顏色 邊框寬度 circleimageview hdodenhof circleimageview circleimageview android layout width 180dp android ...
Andorid第三方字型庫匯入
最近在進行專案設計時,想使用其他一些字型,但android自帶的字型種類好像就是那麼幾種,查閱一些資料,整理了一下android幾種匯入第三方字型庫的方法。權當作為筆記的整理了。詳見我的另一篇文章 andorid自定義控制項之textview自定義字型 這裡推薦乙個第三方全域性匯入字型的專案 cal...