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 该如何计算呢?显示在设备上又应该是多少像素呢?
- dp = 图片尺寸像素 / 图片所在drawable 文件等级的 density
- 设备上显示的像素 = dp * 设备屏幕密度(density)
总结
- 在宽高都设置为 wrap_content 的 ImageView 控件中插入一张图片,如果图片依次放在 drawable 文件 dpi 越大的文件中,控件的 dp 就越小,ImageView 在设备上显示的尺寸也越小,图片在 ImageView 展示就会被压缩。
- 在宽高都设置为 wrap_content 的 ImageView 控件中插入一张来自 drawable-mdpi 文件等级的 120 * 120 图片,其宽高的 dp = 120 / 1 = 120,其展示效果和把图片放入一个宽高都设置为 120dp 的控件中的展示效果一样。但是如果把图片放到大于宽高都设置为 120dp 的控件中,那么图片就会被拉伸显得模糊;反之则会被压缩。