参考链接:
dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算
Android屏幕适配方案总结
Android屏幕适配实例教程「今日头条,AutoSize」
Android屏幕适配实例教程「今日头条,AutoSize」源码链接
- dip或dp: (device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dip=1px.单随着屏幕的密度改变,dip和px的换算也会发生改变。
- px : 像素
- dpi(像素密度) :dots per inch , 直接来说就是一英寸多少个像素点。常见取值 120,160,240。我一般称作像素密度标准dpi的比例(160px每英寸)**
- density(屏幕密度) : 直接翻译的话貌似叫 屏幕密度 (density = dpi / 160)
密度类型 | 代表的分辨率(px) | 屏幕像素密度(dpi) | dp与px的换算 | density |
---|---|---|---|---|
低密度(ldpi) | 240*320 | 120 | 1dp = 0.75px | 0.75 |
中密度(mdpi) | 320*480 | 160 | 1dp = 1px | 1 |
高密度(hdpi) | 480*800 | 240 | 1dp = 1.5px | 1.5 |
超高密度(xhdpi) | 720*1280 | 320 | 1dp = 2px | 2 |
超超高密度(xxhpi) | 1080*1920 | 480 | 1dp = 3px | 3 |
- 屏幕尺寸、分辨率、像素密度三者关系
举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440。
假设我们UI设计图是按屏幕宽度为360dp来设计的,然而上述设备上屏幕宽度其实为1080/(440/160)=392.7dp,也就是屏幕是比设计图要宽的。这种情况下, 即使使用dp也是无法在不同设备上显示为同样效果的。 同时还存在部分设备屏幕宽度不足360dp,这时就会导致按360dp宽度来开发实际显示不全的情况。 因此dpi的值非常乱,没有规律可循,从而导致使用dp适配效果差强人意。
android中的dp在渲染前会将dp转为px,计算公式:
px = density * dp;
dp = px / density
density = dpi / 160;
px = dp * (dpi / 160);
而dpi是根据屏幕真实的分辨率和尺寸来计算的,每个设备都可能不一样的。
寻找适配突破口:
从dp和px的转换公式 :px = density * dp;
可以看出,如果设计图宽为360dp,想要保证在所有设备计算得出的px值都正好是屏幕宽度的话,我们只能修改 density 的值。
这里假设UI设计给我们一张640dp(高) x 360dp(宽)的设计图,那么我们如果要适配所有屏幕,则 density = 设备屏幕的真实宽度(单位:px) / 360dp,这样我们的1dp在所有设备屏幕的宽中所占的比例都是一样的,为1/360,然后我们只要直接照抄设计图中的dp值,宽度就适配啦。