Android屏幕适配
前两天老大要求把车机项目放在手机和平板上也能适配,于是有了这篇文章。
什么是屏幕适配
面试的时候总是会被问到有没有做过屏幕适配,我的回答都是写dp就行了,系统会根据不同的像素密度在屏幕上显示对应的像素值。其实我也不知道正确答案是什么,我估计很多面试官自己也不懂(这个世界就是个巨大的草台班子)那今天就分析下什么是屏幕适配
先看下100dp在平板和手机上的显示效果
乍一看好像也没问题。仔细看看手机里横向估计只能装下3个方块,而平板肉眼一看就知道肯定不止3个。问题出在像素密度上,接下来我拿几个设备和模拟器进行测试
设备种类 | 分辨率(PX) | 像素密度(DPI) | 100dp对应px值(PX) |
---|---|---|---|
车机 | 2560✖️1600 | 160 | 100 |
平板 | 2880✖️1600 | 400 | 250 |
手机1 | 2340✖️1080 | 450 | 281 |
手机 2 | 2400✖️1080 | 480 | 300 |
根据公式反推下 dp = px / (DPI/160)
设备种类 | 分辨率(PX) | 像素密度(DPI) | 100dp对应px | 公式计算dp |
---|---|---|---|---|
车机 | 2560✖️1600 | 160 | 100 | 100 |
平板 | 2880✖️1800 | 400 | 250 | 100 |
手机1 | 2340✖️1080 | 450 | 281 | 99.91…11 |
手机2 | 2400✖️1080 | 480 | 300 | 100 |
可以看到平板方块是占屏幕接近1/7,手机2是5/18接近三分之一,如果多几个方块,显然是塞不下了,这时候就需要缩小方块,具体多大才可以呢,这时候就需要引入两个概念,限定符和最小宽度dp
限定符
这个很容易理解就是mdpi,hdpi,xhdpi等
根据表格
限定符 | 密度范围(DPI) | 缩放比例(基于mdpi) |
---|---|---|
ldpi | ~120 | 0.75 |
mdpi | ~160 | 1 |
hdpi | ~240 | 1.5 |
xhdpi | ~320 | 2.0 |
xxhdpi | ~480 | 3.0 |
xxxhdpi | ~640 | 4.0 |
可得
设备种类 | 限定符 |
---|---|
车机 | mdpi |
平板 | xxhdpi |
手机1 | xxhdpi |
手机2 | xxhdpi |
系统会根据设备的像素密度选择对应的values-Ndpi中的dimen文件,这边可以看到手机和平板最后都会选到xxhdpi,结果跟上图没区别
最小物理宽度DP
就是屏幕的最窄的一个边的dp值,可以获取屏幕宽然后px2dp得到,通常会在res里以sw400dp这样形式的出现
设备种类 | 分辨率(PX) | 像素密度(DPI) | swdp |
---|---|---|---|
车机 | 2560✖️1600 | 160 | 1600 |
平板 | 2880✖️1800 | 400 | 720 |
手机1 | 2340✖️1080 | 450 | 384 |
手机2 | 2400✖️1080 | 480 | 360 |
假设设计图基于2560px✖️1600px,设计的图标是100px✖️100px
根据公式 dp = px / (dpi/160) 车机上100px = 100dp
sw1600dp/dimen.xml
<dimen>dp_100>100dp</dimen>
这时候要适配手机2就需要给平板再创建一个文件values-sw360dp/dimen.xml
计算要注意等比例换算
100px / x = 1600px / 1080px
x = 67.5px
再把x丢到dp = px / (dpi)/160 中得到 dp = 22.5dp 取 23dp
sw360dp/dimen.xml
<dimen>dp_100>23dp</dimen>
同理:平板sw720dp/dimen.xml
sw720dp/dimen.xml
<dimen>dp_100>45dp</dimen>
手机1就没有再写,手机1会使用最接近它的sw360dp中的值,会有一点点细微偏差
最后总结
1.创建values-Ndpi创建个数有限不够精确,属于像素密度分类,想要精准需要用到swdp,可以根据不同的设备创建对应的文件
2.如果只是开发直板手机,直接用dp,这个方案只用来解决又要大屏又要小屏,既要又要还要那种