美文网首页
Android 解决字体随系统调节而变化的问题

Android 解决字体随系统调节而变化的问题

作者: NeWolf | 来源:发表于2017-10-17 10:39 被阅读0次

本文转载自:

如有侵权,请联系我删除

Android 解决字体随系统调节而变化的问题

看了标题也许不太清楚,所以先上两张 滴滴 的截图,对比一下:

1.png.jpeg

2.png.jpeg

应该可以明显的看到,第一张图中红色框中的“分钟”两个字显示不完整,原因就是:1、用户在设置中调节了字体大小,2、红色框布局中TextView使用的是单位为“sp”,并且布局宽高也是固定的。

在这里引入一个知识点:关于sp文档的描述为:

Scale-independent Pixels – Thisislike the dp unit, but itisalso scaledbythe user’s font size preference. Itisrecommend you usethisunitwhenspecifying font sizes, so they will be adjustedforboth the screen densityandthe user’s preference.

“Android sp单位除了受屏幕密度影响外,还受到用户的字体大小影响,通常情况下,建议使用sp来跟随用户字体大小设置。除非一些特殊的情况,不想跟随系统字体变化的,可以使用dp”。按照这么说,布局宽高固定写死的地方应该统一用dp显示字体,因为一旦用户在设置中调大字体,宽高写死的布局显示就乱了。

做个简单的例子,先验证一下:

同样的布局代码

调节设置中显示字体大小

4.png.jpeg

运行后显示样式

3.png.jpeg

3、好了,回到标题要解决的问题,如果要像微信一样,所有字体都不允许随系统调节而发生大小变化,要怎么办呢?利用Android的Configuration类中的fontScale属性,其默认值为1,会随系统调节字体大小而发生变化,如果我们强制让其等于默认值,就可以实现字体不随调节改变,在工程的Application或BaseActivity中添加下面的代码:

@OverridepublicvoidonConfigurationChanged(Configuration newConfig){if(newConfig.fontScale !=1)//非默认值getResources();super.onConfigurationChanged(newConfig);}@OverridepublicResourcesgetResources(){    Resources res =super.getResources();if(res.getConfiguration().fontScale !=1) {//非默认值Configuration newConfig =newConfiguration();              newConfig.setToDefaults();//设置默认res.updateConfiguration(newConfig, res.getDisplayMetrics());      }returnres;}

4、总结,两种方案解决这个问题:

一是布局宽高固定的情况下,字体单位改用dp表示;

二是通过3中的代码设置应用不能随系统调节,在检测到fontScale属性不为默认值1的情况下,强行进行改变。

如有问题,还望提出意见,毕竟个人经验有限。

相关文章

网友评论

      本文标题:Android 解决字体随系统调节而变化的问题

      本文链接:https://www.haomeiwen.com/subject/cknruxtx.html