系统字体大小设置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/murphykwu/article/details/24774015


问题:

    在项目中遇到需要修改字体大小的问题。当修改设置里面字体大小的时候,根据情况决定当前应用是否需要同步系统的字体大小。一般在需要完整显示字体的应用中有此需求。华为荣耀的手机桌面似乎就针对这个做了判断,不管系统字体修改成什么样,似乎都是一个默认值,反正我是没有用肉眼看到有什么改变。虽然有点固定,但是好歹也整成了可以完整显示应用名称了。


分析:

    在设置中既然有该功能,那么我们就进去看看他的代码了。设置界面对于的xml为Settings_headers.xml,一般这个地方比较难找,新手一般只需要知道这个名字就好。找到DisplaySettings.java的writeFontSizePreference函数。就是这个函数负责字体改变之后的系统字体变更。函数代码如下:

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");
        }
    }

可以看到是通过ActivityManagerNative来进行设置(注意这个是一个hide的类)。如果在自己的应用中,可以通过反射的方法获取,并设置字体大小,自己的应用需要声明权限android.permission.CHANGE_CONFIGURATION以及WRITE_SETTINGS权限,并且在Manifest.xml中加入android:configChanges="fontScale"代码,还需要声明shareUserId为System UID。参考此文

    但是在我们的应用中显然需要知道系统的字体修改怎么通知到本应用的,以屏蔽或者修改系统通知中的默认字体大小,选择适合我们应用的字体大小。上面的函数最终会调用功能代码:mRemote.transact(UPDATE_PERSISTENT_CONFIGURATION_TRANSACTION, data, reply, 0);。通过Binder的方式,进行进程间通信,通知系统有东西改变了,赶紧更新。有一篇文章说到了语言更新机制,可以参考一下。

    当系统有更新时会触发Activity的onConfigurationChanged函数进行处理。所以直接重载该函数进行处理就可以了。当然在AndroidManifest.xml中,该Activity必须设置android:configChanges="fontScale"属性,因为我需要监听字体大小的监控,所以赋值为fontScale。


解决方法:

直接重载目的Activity的onConfigurationChanged,如下:

    public void onConfigurationChanged(Configuration newConfig) {
		// TODO Auto-generated method stub
		
		Log.i(TAG, "onConfigurationChanged newConfig.fontScale = " + newConfig.fontScale);
		if(newConfig.fontScale > 1.15f)
		{
		    newConfig.fontScale = 1.15f;
		}
		super.onConfigurationChanged(newConfig);
		Log.i(TAG, "onConfigurationChanged after");
	}

当大于某个值,直接设置成1.15即可。因为系统设置的字体大小:小、普通、大、超大,这些参数是在:package/apps/Settings/res/values/arrays.xml

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

经过修改之后,编译发现有效。


方法二:


另外还有一种方法,不用这么麻烦,直接修改桌面中负责显示图标文字的布局的高就行了。参考源文件:

packages\apps\Launcher2\src\com\android\launcher2\PagedViewCellLayout.java见代码:

mOriginalCellHeight = mCellHeight =
            resources.getDimensionPixelSize(R.dimen.apps_customize_cell_height);

直接修改packages/apps/Launcher2/res/values/dimens.xml中:

<dimen name="apps_customize_cell_height">95dp</dimen>

修改到合适的值即可。这种方法更快捷。


没有更多推荐了,返回首页