获取屏幕像素信息的adb命令:adb shell dumpsys window displays
dp:一个抽象单元,一个dp祖略相当于1px(对于160dpi的屏幕而言)
sp:和dp差不多,但是可以根据用户调节系统字体来设置大小px:真实的像素。
屏幕尺寸:
屏幕尺寸指屏幕的对角线长度。单位是英寸,1英寸=2.54厘米
屏幕分辨率:
屏幕分辨率是指横纵向上的像素点数,单位是px屏幕是由像素点组成,
1px=1个像素点,比如240*240就是指240个像素点乘以240个像素点。
mdpi 120dpi~160dpi
hdpi 160dpi~240dpi
xhdpi 240dpi~320dpi
xxhdpi 320dpi~480dpi
xxxhdpi 480dpi~640dpi
市场上的像素密度等级大体可以分为一下5种:
ldpi (120dpi): 1dp = 0.75px
mdpi (160dpi): 1dp = 1px(baseline)
hdpi (240dpi): 1dp = 1.5px
xhdpi(320dpi): 1dp = 2px
xxhdpi (480dpi): 1dp = 3px
以m为例
如果是hdpi 则1dp = 1.5px
但是mdpi 想要1.5px 则dp就应该是1.5
xhdpi想要1.5px,则dp就应该是0.75
注意:如果你只设置了默认的,系统会为你自动进行缩放!!!!
如果在mdpi生成了 20x20的图片,就该为hdpi生成30*30的图片,以此类推。
系统会根据相应屏幕的dpi选取合适的位图。
drawable目录:
我们经常会给应用切几套图片,放在drawable-mdpi,drawable-hdpi等目录下。
当应用在设备对应dpi目录下没有找到某个资源时,遵循先高后低的原则。
values目录:
一般而言,使用在物理尺寸相差不大的几套设备上,一个values可能就够了,因为它本身就保证了“视觉大小一致性”,但是如果你的应用需要兼容平板,甚至电视,那么这种一致性可能是一种灾难。这时可以考虑添加一个对应dpi的values目录,把需要变化的值拷贝进去重写,但我更推荐采用values-xhdpi-2560x1600,我们很容易通过这里的屏幕分辨率+dpi计算得到该设备的物理尺寸,显而易见这是一个平板设备,如此我们的改动便不至于影响同DPI的低物理尺寸设备(手机),而物理尺寸差不多的设备是可以共用一套dimens.xml的。
比如,当前为hdpi设备,并且只有以下几个目录,则values的寻找顺序为:
hdpi->xhdpi->mdpi->values,即先向上级dpi目录查找,再向下级dpi目录查找,最后一路向下查找到values目录,如果values下都找不到,就只有找values-ldpi,当然,现在有这个目录的应用不多了。
那么,如果当前设备为xhdpi-1184x800,当前目录有values-xhdpi-1184x800,values-xhdpi-1184x960,values-xhdpi-1184x720,android的寻找顺序则是:
xhdpi-1184x800->values-xhdpi-1184x720->values-xhdpi 由高到低
只向低于自己分辨率的目录下寻找,直到values-xhdpi,如果依然没有找到,按照之前的顺序继续进行。
也就是说,对于同dpi的多台不同分辨率平板设备,如果布局足够通用,我们可以只针对最低分辨率设计dimens即可,上面的例子中,则是values-xhdpi-1184x720。