前言
比如美工给的Ui是1080P的,那我们如果以该分辨率为标准的话。
如果美工给的是px,那么除以3就是dp了。
其实这是不对的,除以几不是通过分辨率来决定的。
而是通过dpi来决定的。
而dpi则是每英寸多少像素,越高屏幕越精细。
dpi和dp则完全不同。
dp等同于dip。
在160dpi上1dp就是1px,240dp上则是1.5px。
其实我们写在代码里的dp,最终都要化为px,也就是像素数量来衡量大小。
可能在小公司不考虑适配问题。
直接拿px算dp,然后写在xml里,然后图片,直接要来最大分辨率的图片,直接用dp写死尺寸,其实要求不那么完美的话,也是可以用的。
但如果还是想要做好不同尺寸和分辨率手机适配的话。
现在的最佳适配方案是sw。 最小宽度限定。
目前市面上有非常多的设备的sw值是360dp的。
我们一般创建360dp和480dp的sw文件夹即可,如果要适配平板的话。
就要加上600dp和720dp的文件夹。
那么接下来的关键就是这几个文件夹的文件数值怎么计算了。
dpi计算公式 屏幕最小宽度dp计算需要注意的是最小宽度是不考虑横屏和竖屏的,也就是说最小宽度是屏幕最短的那两条边。
如果需要考虑横竖屏需要加入屏幕方向限定符,不在本文讨论范围。
其实用600dp可以区分手机和平板两类设备了。
比如UI设计尺寸是:750 x 1334 , dpi = 320 , screenWidthDp = 750/(320/160) = 375,以此UI设计尺寸作为基准。
基准:1dp = 1dp = 2px (由于基准dpi是320,1dp=2px)
dpi = 320 --> 1dp = 1 * (375 / 375) = 1dp
dpi = 480 --> 1dp = 1 * (480 / 375) = 1.28dp
dpi = 640 --> 1dp = 1 * (640 / 375) = 1.7dp
dpi = 240 --> 1dp = 1 * (240 / 375) = 0.64dp
dpi = 160 --> 1dp = 1 * (160 / 375) = 0.426dp
//根据屏幕最小宽度的dp值创建文件夹
swdp 倍数关系
values-sw240dp 1dp = 0.64dp
values-sw320dp 1dp = 0.85dp
values-sw360dp 1dp = 0.96dp
values-sw375dp 1dp = 1dp
values-sw400dp 1dp = 1.06dp
values-sw480dp 1dp = 1.28dp
values-sw600dp 1dp = 1.6dp
values-sw720dp 1dp = 1.92dp
values-sw800dp 1dp = 2.13dp
values-sw820dp 1dp = 2.18dp
这些计算的基准是Ui图。
https://github.com/ladingwu/dimens_sw 大神提供的生成sw文件的java项目。
原理是设计稿的宽度是x dp,然后根据设计稿的x dp,生成对应其他具体 比如360 480的values文件即可,根据和x的比例计算,很简单。而默认的文件夹不用生成dimens.xml的。
把常用的设计稿的dp,算出来其他对应的文件里的dp即可。
设计稿是需要有dpi(每英寸像素)和具体px尺寸的,可以用来算设计稿的宽度。
而dp也是通过px和dpi来计算的。
px=dp*(dpi/160) 160dpi是基准dpi。
在160dpi的设备上1dp=1px。
还有一种今日头条的适配方案。
大厂使用,可靠性应该可以。
缺点可能是和第三方库要单独对actvitiy进行适配吧。
虽然现在不怎么做安卓了,但是和同事讨论到这些还是想弄明白。
以上。
网友评论