最近接到需求,要将项目代码移植到另一种低分辨率的机器上运行。原先项目适配的屏幕分辨率是1280*720,新机器屏幕分辨率是1024*600,移植运行后发现界面被裁剪了,在1280*720上完整的界面,到了1024*600上就超出了很多,显示不下!
而我们xml布局明明是用dp单位的呀,换分辨率后不是应该自动变成更少的px,不会出现过大的情况呀。这是为啥呢?
其实,1dp到底实际是多少px像素,是与设备dpi有关的。经过定位发现,原来1280*720的机器是160dpi,而1024*600的机器还是160dpi!!,所以就导致dp占用的px没变化,那当然整个界面就不会自动缩小了。比如原来一个宽1280dp的View,旧机器上是1280dp*(160/160)= 1280px,所以刚好等于屏幕宽度;而换了新机器后,是1280dp*(160/160)还是1280px,而这时的屏幕宽度只有1024,那这个View就超过了屏幕宽度!!
到这里,我们又有一个疑问,物理尺寸不变(也就是对角线英寸不变)的情况下,如果分辨率减小了,那dpi不应该变小吗?怎么还是保持160呢?查阅资料发现,原来系统dpi不等于实际的物理dpi,参考《UI设计师不可不知的安卓屏幕知识》里的介绍:
“实际密度”就是我们自己算出来的密度,这个密度代表了屏幕真实的细腻程度,如上述例子中的440dpi就是实际密度,说明这块屏幕每寸有440个像素。5英寸1080×1920的屏幕密度是440,而相同分辨率的4.5英寸屏幕密度是490。如此看来,屏幕密度将会出现很多数值,呈现严重的碎片化。而密度又是安卓屏幕将界面进行缩放显示的依据,那么安卓是如何适配这么多屏幕的呢?
其实,每部安卓手机屏幕都有一个初始的固定密度,这些数值是120、160、240、320、480,我们权且称为“系统密度”。大家发现规律没有?相隔数值之间是2倍的关系。一般情况下,240×320的屏幕是低密度120dpi,即ldpi;320×480的屏幕是中密度160dpi,即mdpi;480×800的屏幕是高密度240dpi,即hdpi;720×1280的屏幕是超高密度320dpi,即xhdpi;1080×1920的屏幕是超超高密度480dpi,即xxhdpi。
安卓对界面元素进行缩放的比例依据正是系统密度,而不是实际密度。
因此,虽然我们的两款屏幕分辨率不一样,但是系统ROM都是取的160dpi。
那到底我们该怎么适配呢?这里我发现一篇文章写得很好,我也是按这篇文章的方法去适配的。《一种非常好用的Android屏幕适配》。
问题暂时记录到这,后续如果研究了更强大的适配,我再记录。