屏幕适配我们经常接触的有三种:
1.宽高限定符适配
2.今日头条适配方案(密度适配)
3.smallestWidth
1.宽高限定符适配
此种适配就是穷举市面上所有的Android手机的宽高像素值:
设定一个基准分辨率,其他分辨率都是根据它算出.在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件。
比如以480*320为准,此dimens文件如下:
宽度平分320份,x1-----x320;(在这个区间内X的值从1变到320)
高度平分480份.Y1------Y480;(在这个区间内Y的值从1变到480)
分辨率1920*1080:
宽度平分320份,x1-----x320;(在这个区间内X的值从1变到1080)
X1为(1080/320)*1=3.375
X2为(1080/320)*2=6.75
..............
高度平分480份.Y1------Y480;(在这个区间内Y的值从1变到1920)
当手机运行在不同分辨率的手机上时系统分根据demens去寻找对应的分辨率文件夹下的dements.xml
eg:手机的分辨率为1920*1080,系统一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形,简单说,就是容错机制很差。
- 致命缺陷:必须精准命中要不然就是用默认的 ,如果默认分辨率跟手机分辨率相差太大那么图像就会失帧!
2.今日头条适配
这个方案的思路,它是通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值,这样就解决了所有的适配问题。
px=density*dp;
由于各个手机的px值是不以一样的,dp值又是不变的,eg:设计图为360dp,手机的宽度为1200px ,desity=1200px/360dp;
3. smallestWidth适配
smallestWidth又叫做最小宽度适配, 为什么叫最小宽度呢,最小宽度指的是取宽高的最小值,当手机横屏时 宽大于高那么取高,手机竖屏时,宽小于高取宽!
eg:1920*1080 dip480;
dp=px/density;
dp=px/(dip/160)
屏幕的宽度=1080/(480/160);
屏幕的宽度=360;
那么此时系统就会找 sw-360dp文件夹下的diments.xml,如果没有找到就会找与360相近的值,相近在此指的是向下找!
diments.xml解读 :该文件的数据以最小宽度限定符限定, <dimen name="px_xxxxx">这里边的数字是可以自己定义的,比如设计图的宽度是375,手机为1920*1080,dpi=480,那么此时values-sw360dp 中的 dimens.xml文件375处生成的值都等于<dimen name="px_375">360</dimen> 那么 <dimen name="px_376">361....</dimen> <dimen name="px_377">362....</dimen> 这里的值都是可以加的 此文件下不止到375处结束,什么时候结束都是自己可以控制的!