Android中,粗暴的方式,修改字型

2021-09-22 06:47:17 字數 2140 閱讀 8365

前面已經分析了修改字型的所有細節,以及與修改字型相關的 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...