首先理解几个名词
px:像素密度:例如19201080,就是手机长度上1920个像素,而在宽度上有1080个像素
dp:其实dp就是为了使得开发者设置的长度能够根据不同屏幕(分辨率/尺寸也就是dpi)获得不同的像素(px)数量。比如:我将一个控件设置长度为1dp,那么在160dpi上该控件长度为1px,在240dpi的屏幕上该控件的长度为1
240/160=1.5个像素点。也就是dp会随着不同屏幕而改变控件长度的像素数量。关于dp的官方叙述为当屏幕每英寸有160个像素时(也就是160dpi),dp与px等价的。那如果每英寸240个像素呢?1dp—>1240/160=1.5px,即1dp与1.5px等价了。其实记住一点,dp最终都要化为像素数量来衡量大小的,因为只有像素数量最直观。
dpi:(dot per inch)每英寸像素多少,同时dp=px/(dpi/160)
density:密度,即density=dpi/160
了解了上面这些,我们接下来可以说今日头条的适配方案了:
首先明确一点,不管你在布局文件中填写的是什么单位,最后都会被转化为 px。
接下来我们举个例子来说明今日头条的适配方案:
设备 1,屏幕宽度为 1080px,480DPI,屏幕总 dp 宽度为 1080 / (480 / 160) = 360dp
设备 2,屏幕宽度为 1440px,560DPI,屏幕总 dp 宽度为 1440 / (560 / 160) = 411dp
可以看到屏幕的总 dp 宽度在不同的设备上是会变化的,但是我们在布局中填写的 dp 值却是固定不变的
这会导致什么呢?假设我们布局中有一个 View 的宽度为 180dp,在设备 1 中 该 View 的宽度占整个屏幕宽度的50% (180 / 360 =10.5)
但在设备 2 中该 View 的宽度就只能占整个屏幕宽度的 43.8% (180 / 411 = 0.438),可以看到这个 View 在像素越高的屏幕上,dp 值虽然没变,但是与屏幕的实际比例却发生了较大的变化,所以肉眼的观看效果,会越来越小,这就导致了传统的填写 dp 的屏幕适配方式产生了较大的误差
这时我们要想完美适配,那就必须保证这个 View 在任何分辨率的屏幕上,与屏幕的比例都是相同的.所以根据公市px=dp
density这个公式来说,我们要不改变dp的基础上,让设备1和设备2占用屏幕的比例都是50%,那就只能修改density,那对于设备1来说一半的像素是540px=180dp3density ,设备2的一半是720px=180dp4density,这样的话,设备所呈现出来的视觉效果就变得一致了。
而在实际中,假如ui设计师给我们的设计稿是基于360dp,设计出来的,那所有设备的总宽度都是360dp。我们动态修改每个设备的density,就可以保证屏在不同屏幕上的呈现效果都是一致的。
计算公式如下:
屏幕总宽度px/设计师设计稿的宽度(dp)=density,通过这个公式就可以保证在不同分辨率智能智能设备所呈现的效果完全一致。