android 对dp单位的理解


什么是dp?

dp就是dip,device independent pixels(设备独立像素). dip与屏幕密度(density)有关,而屏幕密度又与具体的硬件有关。

QVGA屏(分辨率为:320px * 240px) density=120
HVGA屏(分辨率为:480px * 320px) density=160
WVGA屏(分辨率为:800px * 480px) density=240

apk的资源包中,当屏幕density=240时使用hdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=240时,使用hdpi标签的资源
从 Android 2.2 开始增加了xhdpi分类,
当屏幕density=320时,使用xhdpi标签的资源

Android开发人员一般不考虑屏幕的分辨率,而是它的密度。Android应用开发者在定义布局的UI时,会以密度无关像素(DP)的方式表达布局的维度和位置,这样确保UI在不同密度的屏幕上得以正确显示。

Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi(low)、160 dpi(medium)、240 dpi(high)、320 dpi(xhigh).Android Developers关于dp的文档中px和dp的转换公式:px = dp * (dpi / 160),这里的dpi是归一化后dpi,可选的值只能是120、160、240、320,并非设备真实的dpi。

【切图注意】
从基准线设计的屏幕(记住基线布局设置在320*480)上获取了一个100*100像素的位图图标。将相同的100*100图标配置在lDPI屏幕,该图标会显得很大很模糊。同样地,将其配置在hDPI屏幕上,它会显得太小(由于设备的每英寸的点数比mDPI屏幕多)要调整不同的设备屏幕密度,我们需要在四种密度大小之间按照3:4:6:8缩放比例。使用这些比率,通过简单的计算,android创造四个不同的版本的位图,以供开发生产
75*75对应低密度屏幕(如0.75); ---ldpi
100*100对应中等密度的屏幕(基准); ---mdpi
150*150对应高密度屏幕( 1.5); ---hdpi
200*200对应超高密度显示屏( 2.0)。 ---xdpi

现在有很多应用程序开发商为了降低安装包的大小,只使用一套hdpi资源或者一套xhdpi资源,而不提供mdpi资源或ldpi资源,希望在mdpi和ldpi设备上有系统完成缩放适应,虽然可行,但是我们不应忽视因为缩放带来的图像模糊、显示效果不佳的现象。


【扩展】
Android应用Icon大小在不同分辨率下定义:
对于Android平台来说,不同分辨率下Icon的大小设计有着不同的要求,对于目前主流的HDPI即WVGA级别来说,通常hdpi的应用icon大小为72x72,而标准的mdpi即hvga为48x48,QVGA使用了ldpi,图标为32x32,常见的Android图标大小设计规范如下表所示:
Launcher 和 Menu:36 x 36 px ,48 x 48 px ,72 x 72 px
Status Bar、Tab、Dialog和List View:
24 x 24 px ,32 x 32 px ,48 x 48 px

切图是3的倍数的px,能保证计算出来的dp始终是整数。

 

 

 

从UI设计师的角度理解:

 

px(像素)是我们UI设计师在PS里使用的(不解释),同时也是手机屏幕上所显示的(也不解释)

 

dp是开发写layout的时候使用的尺寸单位,sp是开发写layout时关于字体的字号单位,且dp与sp总为1:1关系

 

 

 

Android支持四种不同的dpi模式:ldpi mdpi hdpi xhdpi

 

 

 

一般地,手机分辨率与所运行的dpi模式是匹配的,例如hvga(320x480像素)的手机屏幕一般在3.5英寸左右,运行在mdpi模式下(也有例外,稍后解释)(这个是ROM控制的,app不能改变)。当运行在mdpi下时,1dp=1px:也就是说设计师在PS里定义一个item高48px,开发就会定义该item高48dp;Photoshop中14px大的字体,开发会定义为14sp。

 

 

 

对于一部wvga(480x800)手机(G7、N1、NS),一般是运行在hdpi模式下。当运行在hdpi模式下时,1dp=1.5px:也就是说设计师在PS里定义一个item高72px,开发就会定义该item高48dp;Photoshop中21px大的字体,开发会定义为14sp。

 

 

 

所以,当你的app需要适配多个dpi模式的时候(例如同时适配mdpi与hdpi),若你在wvga下做设计,你需要将你的各数值都为3的倍数,并在切图标注时将所有的数字除以3乘以2换算成dp,这样开发的同一套layout就能用在两个不同的dpi模式下,而不是写两套layout。

 

 

 

mdpi与hdpi是2:3的关系

 

mdpi与xhdpi是1:2的关系

 

ldpi与mdpi是3:4的关系

 

 

 

 

参考url:

http://www.miiceic.org.cn/zixun/jishu_4763.html

http://blog.csdn.net/eggcalm/article/details/7006378

http://blog.sina.com.cn/s/blog_6b8c21fa0101957d.html

http://www.oschina.net/question/234345_40079

http://www.zhihu.com/question/20697111/answer/15894155

http://www.zhihu.com/question/19625584

 

你可能感兴趣的:(android)