Android屏幕适配
屏幕密度
手机的屏幕密度通常指的是手机屏幕的dpi(dots per inch),也就是每英寸的像素数。对于Android手机来说,常见的dpi有如下几种:
-
ldpi:对应的dpi范围为0 ~ 120,也就是说每英寸有0到120个像素点的屏幕的屏幕密度都属于ldpi
-
mdpi:dpi范围为120 ~ 160
-
hdpi:dpi范围为160 ~ 240
-
xhdpi:dpi范围为240~320
- xxhdpi:dpi范围为320~480
- xxxhdpi: dpi范围为480~560
宽高限定符
宽高限定符是系统原生支持的一种适配方案,通过穷举市面上所有 Android 手机的屏幕像素尺寸来实现适配。就是通过比例换算来为不同分辨率的屏幕分别生成一套 dimens 文件
宽高限定符方案有一个致命缺陷:需要精准命中分辨率才能实现适配。比如 1920 x 1080 px 的手机就一定要引用到 values-1920x1080
文件夹内的 dimens 文件,否则就只能去引用默认的 values 文件夹,此时引用到的尺寸值就有可能和实际需求有很大出入,从而导致界面变形。而对于市面上层出不穷的各种分辨率,开发者想穷举完其实很麻烦,所以说,宽高限定符方案的容错率很低
smallestWidth
smallestWidth 也是系统原生支持的一种适配方案。smallestWidth 即最小宽度,指的是最短的那一个边长,而不考虑屏幕的方向,适配原理和宽高限定符方案一样,本质上都是通过比例换算来为不同尺寸的屏幕分别准备一套 dimens 文件,应用在运行时再去引用相匹配的 dimens 文件,以此来实现屏幕适配。
最终 dimens 文件就像以下这样:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="DIMEN_1PX">0.33dp</dimen>
<dimen name="DIMEN_2PX">0.67dp</dimen>
···
<dimen name="DIMEN_1078PX">359.33dp</dimen>
<dimen name="DIMEN_1079PX">359.67dp</dimen>
<dimen name="DIMEN_1080PX">360.00dp</dimen>
</resources>
类似地,我们再按照上述规则为宽度为 380 dp 的设备生成 dimens 文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="DIMEN_1PX">0.35dp</dimen>
<dimen name="DIMEN_2PX">0.70dp</dimen>
···
<dimen name="DIMEN_1078PX">379.30dp</dimen>
<dimen name="DIMEN_1079PX">379.65dp</dimen>
<dimen name="DIMEN_1080PX">380.00dp</dimen>
</resources>
最终,为市面上主流的屏幕宽度均按照如上规则生成一套专属的 dimens 文件,每套文件均放到以宽度进行命名的 value 文件夹内,就像以下这样:
values
values-sw360dp
values-sw380dp
values-sw400dp
values-sw420dp
这样,我们就可以直接在布局文件中套用设计稿的 px 值了,应用在运行时就会自动去匹配最符合当前屏幕宽度的资源文件。例如,如果我们引用了 DIMEN_1080PX,那么不管是在宽度为 360 dp 还是 380 dp 的设备中,该引用对应的 dp 值都是刚好占满屏幕宽度,这样就实现了适配需求了。