android屏幕适配理解
基本概念:
· in:inches,英寸,屏幕物理尺寸,平时说的多少寸是指对角线长度,1英寸=2.54厘米
· px:pixel,像素,一般的如720*1280表示横向720像素点,纵向1280像素点
· dpi:Dots Per Inch,屏幕像素密度,即屏幕每英寸像素点数
· dp和dip:Density Independent Pixels,dp是dip的简写,别的文章里称为“密度无关像素”,个人感觉与密度关系挺大的- -,以160dpi的屏幕为基准,1dp=1px,也就是说在1英寸内有160个像素点的时候,1dp=1px;那么在一英寸内有320个像素点的时候,1dp=2px。
那么可以这么理解,把屏幕的1英寸分为160格,每一格包含像素数 n px, 就是在这个屏幕上1dp = n px。
推导:比如屏幕密度为m,表明一英寸有m个像素;然后我们把一英寸分为160格,那么每一格的像素数就是 m/160,也就是说这个屏幕内1dp = (m/160) px。
· sp:一般在设置字体大小时用到
使用:
也就是说,比如我们开发使用的手机是720*1280的屏幕,那么在这个屏幕上:1dp=320/160=2px。如果UI标注为80px,那么我们就要设置为40dp
40dp运行在480*800的屏幕上的时候,会自动进行缩放:这个屏幕上1dp=240/160=1.5px,那么40dp=40*1.5=60px。也就是缩放到了60px。但是在屏幕上所占物理距离是一致的
(比例这一行可以忽略掉,mdpi这一行的值就是这个屏幕上1dp=多少px)
适配:
再说适配,如果是上面标准的屏幕像素和密度,那么适配的话我们设置dp应该就可以了(还没深入研究)
如果不标准的话,情况就比较多了:比如我的屏幕分辨率为720*1280,但是尺寸比标准尺寸大,那么我的屏幕像素密度肯定是小于320的,那么我的1dp就是小于2px的。
如果需要强行适配的话,我们需要自己获取屏幕密度,然后进行计算
屏幕密度获取可以使用:
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); float density = dm.densityDpi; //屏幕像素密度 float m = dm.density; //1dp=mpx
问题:
前面提到我们写成dp的时候,在屏幕上所占距离是一致的。那么屏幕大小不同的时候,占一样的物理距离,那么比例可能就不对了,UI肯定不满意。UI的要求是控件所占比例相同,比如都是横向的10%.
参考博客:
http://www.jianshu.com/p/6319e43572fa
http://www.jianshu.com/p/ec5a1a30694b