最近有师傅来公司培训,发现了一个之前没有注意过的问题,有些师傅喜欢手机设置成中型大小的字体,固布局文件中TextView字体大小使用sp作为单位时,再改变系统字体大小时,App字体也会随着系统字体大小改变而改变,这就可能造成APP布局的错位,如图:
e家修师傅.png
我仔细观察比较了其他的几个APP发现微信的字体不会随着系统字体大小改变,于是百度了一下,找到了问题根源和解决办法,分享一下:
在这里引入一个知识点:关于sp文档的描述为:
sp单位除了受屏幕密度影响外,还受到用户的字体大小影响,通常情况下,建议使用sp来跟随用户字体大小设置。除非一些特殊的情况,不想跟随系统字体变化的,可以使用dp”。按照这么说,布局宽高固定写死的地方应该统一用dp显示字体,因为一旦用户在设置中调大字体,宽高写死的布局显示就乱了。
解决的方法也很简单:
利用Android的Configuration类中的fontScale属性,其默认值为1,会随系统调节字体大小而发生变化,如果我们强制让其等于默认值,就可以实现字体不随调节改变,在工程的Application或BaseActivity中添加下面的代码:
@Override
public void onConfigurationChanged(Configuration newConfig) {
//非默认值
if (newConfig.fontScale != 1){
getResources();
}
super.onConfigurationChanged(newConfig);
}
@Override
public Resources getResources() {//还原字体大小
Resources res = super.getResources();
//非默认值
if (res.getConfiguration().fontScale != 1) {
Configuration newConfig = new Configuration();
newConfig.setToDefaults();//设置默认
res.updateConfiguration(newConfig, res.getDisplayMetrics());
}
return res;
}
解决 如下图:
e家修师傅.png
关于8.0不适配:
Android 8.0上会发现这样修改字体的缩放比例是不起作用的,
需要在Activity中同样进行复写getResources()方法。
注意:
所有想要缩放的控件,不只是TextView,任何控件,只需要将尺寸单位换成sp,
当然,不想要随字体调节改变的也只需将dp换成其他单位。
我是阿耀:
有码走遍天下 无码寸步难行
1024 - 梦想,永不止步!
爱编程 不爱Bug
爱加班 不爱黑眼圈
固执 但不偏执
疯狂 但不疯癫
生活里的菜鸟
工作中的大神
身怀宝藏,一心憧憬星辰大海
追求极致,目标始于高山之巅
一群怀揣好奇,梦想改变世界的孩子
一群追日逐浪,正在改变世界的极客
你们用最美的语言,诠释着科技的力量
你们用极速的创新,引领着时代的变迁
------至所有正在努力奋斗的程序猿们!加油!!
网友评论