标签:android style blog class code java tar get string art 2014
在项目中遇到需要修改字体大小的问题。当修改设置里面字体大小的时候,根据情况决定当前应用是否需要同步系统的字体大小。一般在需要完整显示字体的应用中有此需求。华为荣耀的手机桌面似乎就针对这个做了判断,不管系统字体修改成什么样,似乎都是一个默认值,反正我是没有用肉眼看到有什么改变。虽然有点固定,但是好歹也整成了可以完整显示应用名称了。
在设置中既然有该功能,那么我们就进去看看他的代码了。设置界面对于的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"); } }
但是在我们的应用中显然需要知道系统的字体修改怎么通知到本应用的,以屏蔽或者修改系统通知中的默认字体大小,选择适合我们应用的字体大小。上面的函数最终会调用功能代码: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"); }
<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);
<dimen name="apps_customize_cell_height">95dp</dimen>
标签:android style blog class code java tar get string art 2014
原文地址:http://blog.csdn.net/murphykwu/article/details/24774015