Android 适配屏幕的方式有很多,最方便最直接的无非就是适配values里的dimens文件值来进行适配。张鸿洋大神已经写过一篇适配的文章,很详细。但是我在阅读的时候还是有点疑问,这个values-1920x1080到底是dp值还是手机分辨率。因为我在实际操作中发现这样一句话:很明显可以看到在我写的1920 * 1080上方有一句话 Screen dimension in dp ,是不是很奇怪,这里让我们写dp值,我就纳闷了,怎么写?我在网上找了一天,都没有人解释过。所以,我自己来做实验验证一下。

我用的手机是三星note3,分辨率为 1920 * 1080。通过上面代码取值分别为高度 1920、宽度 1080、屏幕密度 3、屏幕密度dpi 360。我生成了以下的文件包,可以看到差不多每种格式的value适配我都生成了一个,里面放的dimens文件。每个包下的文件的后面的值都不一样,有的是50dp,有的是100dp等等。我按手机分辨率生成了一个values-1920x1080的包,然后根据计算,px = dp*(dpi/160),可以知道三星note3的手机的sw是360dp,sw是smallest screen width的缩写。

生成values方式可参照第一张图片,里面有很多方式和种类。px 是1080宽度,dpi查看可知是480,所以dp = 1080/3 = 360dp。两个按钮分别加上点击事件left和right。left点击事件主要是取出手机适配到的dimens值并吐司,right查看手机的信息。

当我运行程序,点击按钮,弹出的数值是values-sw360dp包下的dimens文件里的值。因为手机的最小宽度经过换算正好是360dp,当手机的宽度大于等于360dp时就会选择这个包下的。它只会选若屏幕宽度达到sw480 dp则会选择这个包下的。我们进一步实验,我删除sw360dp的包,继续运行程序,发现吐司出的数值是values-sw320dp包下的dimens里的值,说明这个选择是向下的,并且sw的等级很高。先匹配这个选项。xxxhdpi和values-1920x1080里的文件都没有被选择。

在删除了values-sw320dp包并运行程序后,发现吐司的数值是xxxhdpi下的dimens里的数值。接着,我删除了xxxhdpi包并再次运行,此时打印的是values-1920x1080包下dimens里的值。这进一步证明了这个1920x1080就是分辨率,而非屏幕尺寸(以dp为单位)。可能是谷歌的一个失误,导致了一个误区。在这里,大家需要记住的是,这个数值就是分辨率,而不是dp值。

接下来,我继续删除values-1920x1080这个包并运行程序。结果显示,吐司出的值是values-1024x600里的dimens的数值。这说明匹配方式是向下匹配的。

现在情况已经非常清晰了。另外,需要提醒的是,values-sw xx dp这种格式是在3.2版本中引入的,用于表示values xxxx*xxxx分辨率的样式。这种方式可能需要更晚的时间进行适配,使用时需要注意。如果有版本不兼容的情况,建议使用values-w xxx dp这种方式。需要注意的是,使用这种方式获取的值在屏幕翻转后会发生变化,而sw的不会。请在使用过程中注意这些差异。

如果有任何不妥之处,欢迎提出批评和建议,让我们共同学习进步。