屏幕适配那些事(02)Android逻辑像素刨根问底

屏幕适配是一个老生常谈的问题了,我用这三篇博客和大家讨论点屏幕适配相关的干货。


iOS的屏幕规格可以列举处理,iPhone4及更新的设备,只有4种规格,他们的逻辑分辨率像也是固定的。Android这边就比较复杂了,理论上可以出现无数种逻辑分辨率。Android的逻辑分辨率可以通过三个步骤推导得到:

  1. 获取屏幕像素密度。
  2. 计算逻辑像素密度 = 屏幕像素密度 / 基准屏幕像素密度。
  3. 计算逻辑分辨率 = 物理分辨率 / 逻辑像素密度。

以Nexus 5为例:

  1. 屏幕像素密度480dpi。
  2. 除以基准屏幕像素密度480dpi / 160dpi,得到逻辑像素密度3。
  3. 计算逻辑分辨率:(1920, 1080) / 3 = (640, 360)。

你可能会问,按照上面的推导,屏幕像素密度越低(像素分辨率相同,尺寸越大),逻辑分辨率应该越高。但是上一节讨论中,为什么说“三星S7和三星S7 edge,屏幕尺寸分别为5.1和5.5英寸,但是他们显示的内容是一样多的(逻辑分辨率一致)”?

是的,显然S7和S7 edge的屏幕像素密度是不同的(尺寸不同但是像素分辨率一致),但是为什么逻辑像素密度会一样呢?下面进行解释:

每款Android手机,即使他们的物理分辨率是一样的,逻辑像素也不一定一样,比如Nexus5和Nexus5X。因为厂商给他们设定了不同的屏幕像素密度

Android系统允许在ROM中指定设备的屏幕像素密度。Google曾经给出了几个参考分辨率(160dpi、240dpi、480dpi等),(计算得到的“真实”屏幕像素密度)和参考分辨率接近的设备,推荐将其屏幕像素密度设置到近似的参考值,这样带来的好处就是可以将众多规格的手机的逻辑像素密度进行统一(相近尺寸的手机,其逻辑像素密度相同),进而相对简化适配工作量。

Google的初衷是好的,但是这些参考值并没有让世界变得足够好。比如小米note,Nexus 5X等设备,这些设备因为屏幕更大,但是分辨率没有跟随提升,为了让其显示更多内容,厂家给这些设备设置了“异类”屏幕像素密度。当然这种做法并不是错的,反而带来了更好的体验;只是让Android的逻辑分辨率也裂化了。我们上面说过,屏幕更大的手机就应该显示更多内容。

据我所知,目前国外大厂的Android设备还尽量在遵循Android的参考屏幕像素密度。比如三星和Sony的旗舰设备。

Android SDK中:

  • 屏幕像素密度对应DisplayMetrics类中的densityDpi属性。这个属性是通过build.prop文件中的ro.sf.lcd_density属性配置的。
  • 逻辑像素密度就对应经常使用的density属性。

我们可以总结出一个结论:Android设备,虽然屏幕分辨率不同,但是通常相同大小屏幕的设备具有相同的逻辑分辨率。

有什么指导意义呢?Android设备虽然有数不清的屏幕规格,但是逻辑分辨率的规格就没有那么多啦,而且可以方便的找到几个参考值:360×640(大部分720P及以上手机屏幕)、411×731(部分2K屏幕)等,基准设计稿就可以参考这些值啦。

下一篇文章给出一点我对屏幕适配的建议。