全域性替換字型,開源庫更方便!!!

2021-09-07 15:20:06 字數 1801 閱讀 8477

在 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...