前面已經分析了修改字型的所有細節,以及與修改字型相關的 typeface 類,接下來就開始討論如何修改全域性字型。
本篇會先介紹兩種比較粗暴的方式來修改全域性的字型。
在開始乙個新的專案的時候,一般習慣好點的都會定義乙個 baseactivity 和 basefragment 來作為頁面的基類,這樣可以方便我們在之後的時候,對所有頁面增加一些統一的邏輯。
不過應該不會有人提前想到要給所有的控制項,提前定義乙個自定義的控制項實現。
但是如果在開發的初期,就已經考慮到字型需要修改的情況的話,是可以重寫一些字型顯示相關的控制項。來達到全域性替換字型的作用的。
android 中,最常用的用來顯示字型的控制項,就是 textview,這裡就重寫乙個 textview 來達到替換字型的效果。
在 textview 中,可以通過settypeface()
方法,為 textview 設定乙個字型,settypeface()
方法有兩個過載方法,無非就是多傳遞了乙個需要設定的 textstyle,用來標記粗體和斜體。
其實最終都是呼叫乙個引數的settypeface(
,它才是設定的關鍵。
可以看到,設定字型實際上是操作的 mtextpaint,mtextpaint 是 textpaint 類的物件,直接繼承自 paint,就是乙個用來繪製文字的畫筆。
那麼,我們就可以直接自定義乙個 textview ,在建構函式中,通過settypeface()
方法,來修改 textview 的字型。
主要**如下:
注意,這裡還需要考慮在布局中,為我們設定的 fonttextview 設定的 textstyle 屬性,可能是粗體或者斜體。
那麼來驗證看看實現出來的效果,這裡專門選擇了乙個比較特殊的字型。在布局 xml 檔案中,新增三個 fonttextview。
再來看看執行的效果。
這裡也考慮了在布局中設定的 textstyle,並且乙個已經比較傾斜的字型,使用 italic 標記之後,更傾斜了。
這個方法,如果在開發初期,還可以接受,無非就是寫布局的時候,需要注意使用自定義的控制項,同時還除了 textview ,還需要重寫 button、edittext 等一系列需要顯示文字的控制項,說到底還是有點麻煩的。
而且如果是在乙個已經成熟的專案上再使用這種方案,改動起來還是很費勁的,基本上就是一通文字替換,改動會比較大一些。
在 android 中,用於顯示文字的控制項,都是直接或者間接整合自 textview 的,那麼我們只需要找乙個合適的時機,遍歷布局的 viewtree,將其中所有 textview 的子類都獲取出來,然後批量修改它們的字型,同樣也可以達到全域性替換的效果。
在這個replacecustomfont()
的方法裡,回去判斷是否繼承自 textview,如果是就替換字型。如果不是,再判斷是否是乙個 viewgroup,如果是的話,從其內取出所有的子 view,再遞迴呼叫replacecustomfont()
方法。
通常,為了在合適的時機修改字型,我們可以將這個方法加在activity.oncreate()
方法,或者fragment.oncreateview()
方法的後面,修改的地方,相對少一些,不過還需要考慮 listview、recyclverview 這種動態生成 view 的邏輯,也需要注意不能遺漏。
舉個例子,寫乙個布局,在activity.oncreate()
方法中,呼叫replacecustomfont()
方法。
最後展現的效果如下。
使用這種方式,優點是,不需要修改 xml 布局,不需要重寫多個控制項。只需要在inflater view的之後,呼叫一下replacecustomfont()
方法即可。
缺點也非常的明顯,每個頁面都需要修改,有動態載入 view 的地方可能會被遺漏,改動相比較之前的方案,稍微少一點。並且違背了元件的設計原則,實現方式也略顯粗暴。同時它每次都會遞迴遍歷 viewtree,效能上多少都會有點影響。
本文介紹的幾個辦法,在實際開發中,可能也用不上。不過不影響我們了解這樣的方法。
到現在為止,介紹的替換字型的方案,其實並不夠優雅。從下期開始,就會開始介紹一些更優雅的方式,在現有專案上,全域性的替換字型的一些方案。期待你的持續關注。
一種粗暴快速的Android全螢幕適配方案
本文講的是一種粗暴快速的android全螢幕適配方案,由於android碎片化嚴重,螢幕適配一直是開發中較為頭疼的問題。面對市面上五花八門的螢幕大小與解析度,android基於dp與res目錄名稱來適配的方案已無法滿足一次編寫全螢幕適配的需求,為了達到最優的視覺效果,開發過程中總是需要花費較多資源進...
android中修改Viewpager的滑動速度
viewpager預設的滑動速度非常快,不論是自己手指滑動或者是通過viewpager的setcurrentitem index 方法都是一閃而過。通過修改android.widget.scroller可以修改viewpager的滑動速度。public class myfixedscroller e...
android修改預設的logo
以freescale為例 1.修改uboot啟動時的freescale字樣 可以在u boot中board freescale common fsl bmp 600x400.c改變影象。具體步驟如下 1 準備一張bmp格式的,最好畫素是600x400的 2 將該轉換成.c檔案,通過軟體bin2txt...