今天老大说让我去弄下华为手机上设置字号为特大后会出现我们应用的里面布局的错乱,看原因不过是系统更改了我们应用里面的字号,导致我们的原有的布局会出现部分错乱,出现这个问题当然是不能忍的,为了能保证无论什么手机设置什么字号都能保证我们最终显示的效果不变,我做了一下的处理。但是对于不同的项目可能会有不同,但是说了这个思路对大家解决这个问题至少是提供了一个入口。
说下我的思路吧。
完全没有头绪;
于是我就想看看当我设置不同的字号时,对于相同的文字显示出来的size是多少,我看了看,设置不同的字号得到的文字的size也是不同的;
既然文字的大小有了,我就想看看文字对应的sp是不是一样,打印出来的结果基本是一样的,可能会有少许偏差,毕竟是浮点数的运算。不过大致都在我们xml文件里面给的那个值的范围
(-0.2~+0.2)
,说明sp是没有跟着体统设置的字号的改变而改变。再将
px
转sp
的时候,为了看转化式子的时候看到了metrics.scaledDensity
,于是我就打印这个看了看,然后切换不同的字号的时候,这个是在变的,调成普通显示的值为3.0
。因为我用的1080P
的分辨率,我们知道px
在这种屏幕尺寸上,1dp = 3px
,所以体统改变手机系统的字号,肯定是与scaledDensity
这个属性有关,手机设置里面是改变了系统中scaledDensity的值,从而造成各个APP里面原生的字号被改变,为了能够保持我们界面的不变,所以我们必须拿到不同屏幕尺寸下各个原始的缩放系数,于是开始看DisplayMetrics
里面的属性和方法,发现了density
,尝试着打印出来看了看,发现这个值是固定的,换了台720P
的手机看了看,这个值为2.0
,而之前1080P
上显示的是3.0
,所以这个就是保存原始比例系数的值,到这我们的思路就出来了,只要我们将scaledDensity
的值赋值为density
,这样我们就能保证我们界面中的字号不会随着外部的设置改变而改变。有了上面的步骤,接着我在
Application
中的onCreate
方法中添加了下面的代码
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
displayMetrics.scaledDensity = displayMetrics.density;
但是这个只有刚进入的时候有用,如果我们中途HOME出来,更改了字体大小,我们APP里显示的字号还是会改变的,所以最后我在我们项目的基类BaseActivity中的onCreate()和onRestart()方法中都添加了上述代码,考虑到Activity的生命周期,最终我们只需要在onStart()
加上这段代码就好了。测试了一下,发现问题被解决了。