Android 屏幕适配总结

Android 的碎片化越来越严重,因此屏幕适配十分重要但又比较繁琐,现对 Android 的屏幕适配做下总结。

概念

Android 屏幕适配必须了解的几个概念:

  • px

    意为像素,是用来计算数码影像的最小单位。

  • in

    表示英寸,指的是手机屏幕对角线长度(我们平时说手机 xx 寸就是指英寸)。

  • dpi

    表示每英寸点数,即每英寸包含像素个数。比如320X480分辨率的手机,宽2英寸,高3英寸, 每英寸包含的像素点的数量为320/2=160dpi(横向)或480/3=160dpi(纵向),160就是这部手机的dpi,横向和纵向的这个值都是相同的。

  • density

    屏幕密度,density和dpi的关系为 density = dpi/160

  • dp

    也即dip,设备独立像素,device independent pixels的缩写,Android特有的单位。在屏幕密度dpi = 160屏幕上,1dp = 1px。

公式

各类型设备屏幕对应的 dpi 等级、屏幕像素密度、屏幕密度如下表。

设备 dpi 等级 屏幕像素密度(dpi) 屏幕密度(density)
ldpi 120 0.75
mdpi 160 1
dpi 240 1.5
xhdpi 320 2
xxhdpi 480 3

我们知道一个 Android 项目的资源文件下有很多类型的 drawable 文件夹,分别对应不同的 dpi。

drawable 文件等级 dpi(drawable) density(drawable)
drawable-ldpi 120 0.75
drawable-mdpi 160 1
drawable-hdpi 240 1.5
drawable-xhdpi 320 2
drawable-xxhdpi 480 3

当我们在宽高都设置为 wrap_content 的 ImageView 控件中插入一张图片,那么这张图片的尺寸换算成 dp 该如何计算呢?显示在设备上又应该是多少像素呢?

  1. dp = 图片尺寸像素 / 图片所在drawable 文件等级的 density
  2. 设备上显示的像素 = dp * 设备屏幕密度(density)

总结

  1. 在宽高都设置为 wrap_content 的 ImageView 控件中插入一张图片,如果图片依次放在 drawable 文件 dpi 越大的文件中,控件的 dp 就越小,ImageView 在设备上显示的尺寸也越小,图片在 ImageView 展示就会被压缩。
  2. 在宽高都设置为 wrap_content 的 ImageView 控件中插入一张来自 drawable-mdpi 文件等级的 120 * 120 图片,其宽高的 dp = 120 / 1 = 120,其展示效果和把图片放入一个宽高都设置为 120dp 的控件中的展示效果一样。但是如果把图片放到大于宽高都设置为 120dp 的控件中,那么图片就会被拉伸显得模糊;反之则会被压缩。