Android中修改默认字体的大小----fontScale

来源:互联网 发布:老版本知乎2.4.4 编辑:程序博客网 时间:2024/06/05 04:46

有客户需求要修改系统中默认字体的大小。

一般的步骤是,在frameworks/base/core/java/android/content/res/Configuration.java文件中,修改函数setToDefaults中fontScale的值,例如改成:fontScale = 1.18f 。然后在packages/apps/Settings/res/values/arrays.xml中,修改数组entryvalues_font_size中的值,使其中有一个值何默认值是一样的即1.18(不然的话会出现默认字体是一个大小,然后在Settings->Display->Font size中设置的时候就设置不了默认的fontScale了,也会出现比如明明最开始的时候字体是normal,但是再次点击normal的时候字体会改变)。

 /**     * Set this object to the system defaults.     */    public void setToDefaults() {        fontScale = 1;        mcc = mnc = 0;        locale = null;        userSetLocale = false;        touchscreen = TOUCHSCREEN_UNDEFINED;        keyboard = KEYBOARD_UNDEFINED;        keyboardHidden = KEYBOARDHIDDEN_UNDEFINED;        hardKeyboardHidden = HARDKEYBOARDHIDDEN_UNDEFINED;        navigation = NAVIGATION_UNDEFINED;        navigationHidden = NAVIGATIONHIDDEN_UNDEFINED;        orientation = ORIENTATION_UNDEFINED;        screenLayout = SCREENLAYOUT_UNDEFINED;        uiMode = UI_MODE_TYPE_UNDEFINED;        screenWidthDp = compatScreenWidthDp = SCREEN_WIDTH_DP_UNDEFINED;        screenHeightDp = compatScreenHeightDp = SCREEN_HEIGHT_DP_UNDEFINED;        smallestScreenWidthDp = compatSmallestScreenWidthDp = SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;        densityDpi = DENSITY_DPI_UNDEFINED;        seq = 0;        simSetLocale = false; /// M: sim locale feature    }
 <string-array name="entryvalues_font_size" translatable="false">        <item>0.85</item>        <item>1.0</item>        <item>1.15</item>        <item>1.30</item>    </string-array>


在修改的过程中,看到一种比较好的字体大小与显示之间的对应关系:

在显示Display界面时,会运行Settings/src/com/android/settings/DisplaySettings.java这个类,在onResume的时候,会调用函数updateState(),在这个函数中接着会调用readFontSizePreference(mFontSizePref);在这个函数中会获取当前系统中的字体大小:

public void readFontSizePreference(ListPreference pref) {        try {        Log.d("zhangmq", "readFontSizePreference ActivityManagerNative.getDefault().getConfiguration() = "                 +ActivityManagerNative.getDefault().getConfiguration());            mCurConfig.updateFrom(ActivityManagerNative.getDefault().getConfiguration());        } catch (RemoteException e) {            Log.w(TAG, "Unable to retrieve font size");        }        // mark the appropriate item in the preferences list        Log.d("zhangmq", "readFontSizePreference mCurConfig.fontScale = " + mCurConfig.fontScale);        int index = floatToIndex(mCurConfig.fontScale);        Log.d("zhangmq", "readFontSizePreference index = " + index);        pref.setValueIndex(index);        // report the current size in the summary text        final Resources res = getResources();        String[] fontSizeNames = res.getStringArray(R.array.entries_font_size);        pref.setSummary(String.format(res.getString(R.string.summary_font_size),                fontSizeNames[index]));    }
真是有趣的是floatToIndex方法:

int floatToIndex(float val) {        String[] indices = getResources().getStringArray(R.array.entryvalues_font_size);        float lastVal = Float.parseFloat(indices[0]);//获得数组中的第一个值,如0.85        Log.d("zhangmq", "floatToIndex lastVal = " + lastVal);        for (int i=1; i<indices.length; i++) {     //循环比较,从第二个值开始        Log.d("zhangmq", "floatToIndex fffffffffffffff ");            float thisVal = Float.parseFloat(indices[i]);            Log.d("zhangmq", "floatToIndex thisVal = " + thisVal);            if (val < (lastVal + (thisVal-lastVal)*.5f)) {  //val与 前一个值加上后一个减去前一个值得差值的一半 进行比较,即与两个相连值得中间值比较             Log.d("zhangmq", "floatToIndex qqqqqqqqq i-1 = " + (i-1));                return i-1;                  //如果val小于两个相连值得中间值,则index去前一个值,否则继续循环比较            }            lastVal = thisVal;            Log.d("zhangmq", "floatToIndex iiiiiiiii lastVal = " + lastVal);        }        return indices.length-1;    }


有时候会在overlay中进行覆盖Settings中的entryvalues_font_size,如果修改Settings中的entryvalues_font_size没作用,可以查看是否被overlay等覆盖了。









0 0
原创粉丝点击