1. 程式人生 > >android-settings新增字型更換-中篇-FontStyle更換的解決方案

android-settings新增字型更換-中篇-FontStyle更換的解決方案

想到字型更換,首先最簡單的山寨方法,應該是想著可以替換系統的ttf字型檔案,然後手動重啟,系統根據目錄和名稱找到該檔案,構造Typeface,然後TextView使用這個Typeface。

但是,作為一個可以釋出的應用,應該不可以這樣(可以討論),方法應該有很多種,懇請各位大神指導,MTK文件提供了一種方案,來看看這種基於此的一種方案。(效果可參考三星,其內部實現不太清楚)。

字型作為一種特殊的資源,其表現可參考,fontScale的設定過程,在Settings的原始碼包裡面的Display_setting中可以看到,FontScale更改後修改到SystemSetting的資料庫,同時呼叫ActivityManagerService(AMS)的updateConfiguration,更新相關資源,重啟所有可見視窗,達到目的。

public void writeFontSizePreference(Object objValue) {
        try {
            mCurConfig.fontScale = Float.parseFloat(objValue.toString());
            ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig);
        } catch (RemoteException e) {
            Log.w(TAG, "Unable to save font size");
        }
    }

(補充說明:呼叫服務不太瞭解的先看看android服務框架,同時學習AMS,也可看做直接呼叫)

類似於上面,選擇FontStyle,更新資源,通知AMS 配置已經更改,重啟Activity。

需要修改的系統檔案,

Configuration.java---新增有關字型的屬性(我們用包名和路徑來確定:原因下篇講)、修改相應的diff,update,write,read等函式,

ActivityInfo.java---新增FontStyle屬性值常量(參考FontScale)。

AMS.java---新增成員變數,在初始化的函式中,從檔案中獲取FontStyle屬性值。在updateConfigrationLock函式中,儲存FontStyle屬性值到檔案。

( 這樣保證了開機後可以使用上次儲存的字型)

TextVIew.java---修改初始化函式,在設定字型、前設定判斷,若為預設則呼叫原方法,

當FontStyle屬性值不為預設時從FontStyle屬性來重新構造Typeface。

這樣修改後,理論上修改FontStyle後會重啟所有Activity,來修改字型,不過很快就會發現一

個問題,即,狀態列的字型沒有修改,這是因為SystemUI是一個特殊的apk,AMS的重啟沒

有包括SystemUI,我們需要自己新增修改,這樣在Intent.java中新增一個廣播常量字串,

在AMS的updateConfigrationLock中,發出字型改變的廣播,SystemUI的PhoneStatusBar

中接收廣播,更新所有的TextVIew就OK了。

(僅僅為一種方案,具體細節不再贅述)