px,dp,dip,dpi,sp 等到底有什么联系区别

px、dp、dip、dpi、sp&等到底有什么联系区别?
从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的关系
Galaxy Nexus 是720P屏幕,就是运行在xhdpi下的。
可以想见为什么iOS的开发者升级到 Retina Display 是多么的无痛
再 补充一种例外,有些比较山寨的Pad有可能是7英寸屏幕,分辨率为wvga(480x800)运行在mdpi下,所以一部wvga手机是
320x533dp,一部wvga平板是480x800dp,可以显示的内容会多很多。
我语言没有梳理的很清楚,希望你看得懂:P
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。dp 这个单位是安卓发明的么?为什么 px=dp*(dpi/160)?
在Xdpi下绘制Xpx长度,实际的物理距离都是1英寸,为什么一定要选160呢?如果设定宽高为厘米,或者英寸之类的物理单位,屏幕根据dpi的大小来计算要显示多少像素才能达到这个物理单位,不是更好?为什么要引入dp?
按投票排序
作为一个经常拿着计算器算长宽,然后给 Android 应用各个分辨率提供界面切图的死美工,我想尝试回答一下后半个问题,也就是为啥以 160 dpi 作为基准:Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75 来给界面中的元素来进行尺寸定义。也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 的倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。但假设以 240 dpi 作为标准,那需要 DP 是 3 的倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi 话说我觉得在给 Android 的应用提供切图的时候经常像是在算 24 点。。。[1]
1.在Xdpi下绘制Xpx长度,实际的物理距离都是1英寸,为什么一定要选160呢?
答:这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。The generalized sizes and densities are arranged around a baseline configuration that is a normal size and mdpi(medium) density. This baseline is based upon the screen configuration for the first Android-powered device, the T-Mobile G1, which has an HVGA screen (until Android 1.6, this was the only screen configuration that Android supported).
为什么说是属于呢?
因为我查过T-Mobile G1的DPI,其实它准确的DPI不等于160,G1的配置信息如下:屏幕尺寸:3.2 寸(8.1 厘米)分辨率:320 x 480(HVGA)
在计算DPI前我先简单介绍一下DPI以及相关概念,DPI(Dots Per Inch)翻译为每英寸像素点的个数,英寸是一个物理单位,1英寸 = 2.54厘米,大家平常说的手机屏幕4.3英寸,4.5英寸指的是屏幕对角线的长度,如下图所示:
分辨率480 x 800,屏幕尺寸4.3英寸和分辨率540 x 960,屏幕尺寸4.5英寸的DPI分别是:
分辨率480 x 800,屏幕尺寸4.3英寸和分辨率540 x 960,屏幕尺寸4.5英寸的DPI分别是:
如果按照这样的计算方式的话,T-Mobile G1应该为180dpi,这个计算大家可以使用计算器或者手动的计算方式得出,为了更具说服力,我贴出自己的计算截图(使用DPI Caculator计算)
如果按照这样的计算方式的话,T-Mobile G1应该为180dpi,这个计算大家可以使用计算器或者手动的计算方式得出,为了更具说服力,我贴出自己的计算截图(使用DPI Caculator计算)
大家可以看到计算出来的结果是180而不是160,大家会想那为什么不直接用180作为基准(mdpi)而是160呢?这就好像为什么是二进制而不是其他进制,就像@
大家可以看到计算出来的结果是180而不是160,大家会想那为什么不直接用180作为基准(mdpi)而是160呢?这就好像为什么是二进制而不是其他进制,就像@说的,180上下不好做适配,但是160无论是乘以0.5/2/1.5都很好适配,这就是为什么我说属于而不是等于,Android其实为了不至于为每一个设备制造商做适配(其实资源文件的分包就算适配了:drawable-hdpi,drawable-ldpi),将不同屏幕大小和不同dpi的设备大致划分为四类,如下图:
大家可以看到T-Mobile G1的参数属于mdpi区域的,以上就是取160dpi作为基准的原因。
大家可以看到T-Mobile G1的参数属于mdpi区域的,以上就是取160dpi作为基准的原因。2.如果设定宽高为厘米,或者英寸之类的物理单位,屏幕根据dpi的大小来计算要显示多少像素才能达到这个物理单位,不是更好?为什么要引入dp?
如果有兴趣可以看一下这个类的源码(网址): ,这个类中有很详细的dpi相关的成员函数和变量,下面的代码是在开发时获取dpi的代码,DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
iDensity = (int)( metrics.density * 160 );
(1)我先回答前半部分,“如果设定宽高为厘米,或者英寸之类的物理单位,屏幕根据dpi的大小来计算要显示多少像素才能达到这个物理单位,不是更好?”
答:我认为设置宽高为厘米/英寸,然后先通过上面代码动态计算dpi的值,然后再根据计算出的dpi计算出显示控件需要的宽和高是可行的,但是绝对不是更好,而是非常差,因为开发的原则遵循的是界面设计和功能逻辑分离,在程序中每次都首先需要计算一下dpi才能设定其他控件的宽高属性是很不友好的,你想想,你启动了某个程序,它界面一直出不来,后台还在计算着DPI,用户体验也不会好,超过5s估计就被当作ANR给kill掉了。
(2)为什么要引入dp?
答:dp实际是dip(density independent pixel),独立密度像素,意思就是与density密度(dpi)无关,我使用dp作为单位设置控件,不管你什么屏幕大小,多大的dpi,显示的效果始终保持一致。假如我们不引入dp,还是使用原始的px,现在我们需要在手机屏幕上绘制一条直线,在160dpi(每英寸160个像素点),而宽度是1英寸的手机上做开发和测试工作,我们设置这条直线长度是160px(占据160个像素点),也就是直线长度正好是手机的宽度,开发工作完成,我们把app发布到市场上,这时候用他同样宽度1英寸,但是240dpi的手机安装了这个app,他能不抓狂!本该长度有屏幕这么宽的线视觉上只有原来的2/3,如果整个UI都使用px作为单位,就会有如下的效果。Example application without support for different densities, as shown on low, medium, and high density screens.上面这张图来自Google的开发网站。如果引入dp这个单位,这种问题就不会发生了,还是以上面的例子说明,如果在160dpi的设备上使用的是160dp,无论移植到240,120dpi上显示效果都是一致的。px和dp的换算公式,效果如下图:
1 是不是Android 发明的DP,这个我不知道,参考别人的答案吧。(是安卓定义了这个单位,但这类概念相信早就有了)2 为什么选160,因为第一款机子是160,于是就成为标准了。(160 约等于HVGA 屏幕手机的像素密度)3 为什么要用DP,简单来说减少开发成本。一个app要在240x320 分辨率的低端机上运行,也要在1080P 的高端机上运行,软件写代码的时候,这个图标定义多大呢。用px做单位显然不合适了,所以引入了dp。不同开发多个版本而实现UI的自适应。系统只认px,不认识厘米,设定160dp的长度,相当于告诉手机在160dpi屏幕上显示160px,在240dpi屏幕上显示240px 。如果根据屏幕密度换算像素让系统去用,你这台手机是方便了,"在Xdpi下绘制Xpx长度,实际的物理距离都是1英寸" 屏幕升级了呢?代码重写一遍再调一次UI?话说iOS就是为了省事,iPHone4 直接翻倍。原来iPhone iPhone 3G
iPhone 3GS
都是160,突然iPhone4 就320了。为的是开发者方便,UI大小相关的乘以2即可,GUI设计切图无脑放大一倍, 同学也不同按计算器算24了。但是翻倍一时爽,看着Android阵营屏幕稳步升级,iPhone总不能再翻倍吧,320已经视网膜了。所以iPhone 5 只好加长了,被逼无奈。 同学还是可以按照iPhone 4 的规格切图,软件只要针对iPhone 5 调整下坐标位置就好了。然后我为iPhone 6 捉急啊,如果要上1080P,就没有省事的方案了, 同学又得拿出计算器切图了 XD
现有回答已经讲过几个原因了:1. 160dpi 为基准比较方便换算。但是仔细想的话,这个理由其实不成立。因为其他几个dpi本来就是根据基准定出来的。比如用240dpi作为基准,你可以改为360dpi(1.5)、240dpi、180dpi(0.75)、120dpi(0.5)。2.
第一款机型是160dpi。这看上去是比较靠谱的原因。但其实如@所说,第一款机型G1实际上是180dpi的。3. 我个人补充一个可能:dp实际上几乎就是css px。现在css pixel的定义是1/96in。但是注意css pixel其实原本是相对单位,以视角定义。即使现在固定为1/96in,但是所有绝对长度单位都是可根据情况进行anchor,几乎所有屏幕设备都是根据设备像素进行比例缩放,也就是跟dp是完全类似的。而css pixel的1/96in是按照桌面屏幕来算的,移动设备的典型可视距离比桌面屏幕要近,如果取0.6倍,则换算结果正好是1/160in。当然这同样不足以解释为什么是160dpi而不是180dpi。我个人的猜测是因为iphone是160dpi的。
经过一番搜寻后,我自我解答dp就是一个类似于pt的单位pt全称为point,但中文不叫“点”,查英语字典可以看到,确切的说法是一个专用的印刷单位“磅”,大小为1/72英寸。所以它是一个自然界标准的长度单位,也称为“绝对长度”。  1in = 2.54cm = 25.4 mm = 72pt = 6pc  因此就有这样的说法,在网页设计中,pixel是相对大小,而point是绝对大小。在安卓设计中,pixel是相对大小,而dp是绝对大小。之所以是160来换算,仍然不太懂
只是想设计个APP界面与切图而也,搞这么复杂就行了;直接说160是比较适中的一种分辨率容;在做设计的时候以480*800为适中然后向上剩2或向下除2或1.5;
最后输入四种不同的尺寸就得了;而且上面的公式讲得也太复杂了点有没得更好更简单的计算公式;
上面的公式讲得也太复杂了点,平时都使用自动计算方式顺便附上链接顺便附上链接
我在想会不会存在dpi相同尺寸不同的手机,也就是同样的密度,不同大小。这app跑起来就蛋疼了。哇塞,怪不得手机版、pad版,这俩货不就是这情况吗好吧
其实应该是dp = px * (dpi/160)
上面的回答得都很详细了 我来总结一些经验:1.xml布局时候尽量少出现dp 杜绝px 2.多用weight权重分割布局 gravity设置重心布局3.align+(如layout_alignright)系列布局再用margin+(如layout_marginleft)系列调整view之间的距离(我认为align和margin组合对于网传那么严重的碎片化可以很好解决 现在低端机都能350dp以上 dp跨度以后会越来越小 碎片化迟早会完美解决的。所以碎片化明显是夸大的) 能最大限度的减少不同dip手机的布局误差4.一些按钮,拖动条肯定会因为机型繁多dp各异发生大小变化 为了适应低端机 应该适当做小点我认为安卓机采取iPhone6 plus的dp再高百分之十 屏幕就已经完美了 此时色彩明艳感达到最好(三星的屏做到了)我所指的碎片化是指应用软件开发层面上的。 关于系统和驱动程序的碎片化不作考虑 我估计很难解决有更好的解决方式 请大神留下评论。
已有帐号?
社交帐号登录
无法登录?
社交帐号登录px、dp、dip、dpi、sp 等到底有什么联系区别?产生的根源和设计时的影响如何?是否屏幕密度的决定原因?
按投票排序
补充 @酱油会飞 @樊旭从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的关系Galaxy Nexus 是720P屏幕,就是运行在xhdpi下的。可以想见为什么iOS的开发者升级到 Retina Display 是多么的无痛再补充一种例外,有些比较山寨的Pad有可能是7英寸屏幕,分辨率为wvga(480x800)运行在mdpi下,所以一部wvga手机是320x533dp,一部wvga平板是480x800dp,可以显示的内容会多很多。我语言没有梳理的很清楚,希望你看得懂:P可以参考: 以及 Supporting Multiple Screens
这是Android官方文档里面有的东西
px( pixel) 像素,可以简单的理解为一个点或方块,用以颜色的显示(单位),一般指印刷品或屏幕设置设备的颜色显示定义。dip(device independent pixels)设备独立像素. 不同设备有不同的显示效果,这个和设备硬件有关,多为了支持WVGA、HVGA和QVGA 使用,不依赖像素。 dpi(dots per inch)分辨率、解析度,每英寸像素数,多用于屏幕显示领域。类似的有ppi(Pixels per inch)多用于印刷领域。分辨率越高,则每英寸内包含的像素数越大。sp (scaled pixels)像素(图像)缩放,在 常规情况下,尺寸大的图像(像素数量或密度高)缩放为小图像(像素数量或密度小)时清晰度不变或清晰(原图模糊时),逆向则反之。但可以通过像素插值/超样采集等技术实现相对清晰(计算轮廓边缘模拟出相似或智能分析增加清晰度、圆润感)px(像素)和dpi(分辨率)的关系,分辨率表示每英寸内包含多少个像素,比如分辨率为72dpi时,即表明每英寸内有72个像素。在屏幕显示时像素和屏幕上的点可以是点对点或非点对点。sp(像素缩放)和px、dpi之间没有直接换算关系,比如一个原始图像为100×100px时,把它缩放为60×60或40×80(等比例缩放或自由缩放)相关的像素排列和原始颜色会打乱,减低或保持包含颜色数量(在常规放大时不会增加包含的颜色数量),边缘颜色数量会减少。dip和以上有些相似,这个因为未涉及不是很了解。网上找到一个换算/计算公式供参考:据px = dip * density / 160,则当屏幕密度为160时,px = dip
根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知Android默认使用sp作为字号单位。将dip作为其他元素的单位。url:
一、度量单位的定义1、dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA(800*480)、HVGA和QVGA 推荐使用这个,不依赖像素。dp是开发写layout的时候使用的尺寸单位,sp是开发写layout时关于字体的字号单位。2、分辨率是屏幕的精密度,是指所能显示的点的多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。3、px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。px是分辨率的单位,也就是说320x480的分辨率内,共有153600px个像素。4、屏幕密度:表示每英寸有多少个显示点,与分辨率是两个不同的概念。单位是dpi(dot per inch)。dpi的计算:dpi=Diagonal pixel/ Screen sizeDiagonal
pixel表示对角线的像素值比如:计算WVGA(800*480)分辨率,3.7英寸DPI==933/3.7=252Android主要有以下几种屏:如下表
二、视觉与客户端之间的沟通1、例如,视觉给出的视觉稿标注的就是12 dp,这样客户端开发就不需要换算,可以直接使用12 dp。每一台移动设备都会自动根据屏幕尺寸调整间距,字体大小,来保证这个间距是12 dp。2、当视觉给出的视觉稿标注的是像素时,需要客户端的开发先计算出相应的dp,具体的计算公式为:px
= dip * (density / 160),然后使用计算出的dp,移动设备会自动适配。同时也就是说,当屏幕密度为160时,px = dip。确定的dp,就是不同的设备,间距的像素值可能会不同,但是dp一定相同。3、例如分辨率为320 x480时,屏幕尺寸为3.0—3.5时,屏幕密度为Medium,默认值为160,由公式得px=dp;当分辨率为480 x800时,屏幕尺寸为3.3—4.0时,屏幕密度为high默认值为240,由公式的px=1.5dp,字号(在系统中选择普通字号)是视觉给字号大小的1.5倍,px=1.5sp。
推荐一张Android UI设计参考图
px (pixels)像素 -- 是像素,就是屏幕上实际的像素点单位。dip或dp (device independent pixels)设备独立像素, 与设备屏幕有关。sp (scaled pixels — best for text size)放大像素-- 主要处理字体的大小。dpi:屏幕像素密度。至于根源。android最早是没有考虑到这么多屏幕分辨率的。最早的机器是g1,他的分辨率是480*320。但是,由于android是开放的平台,各种各样分辨率的设备都可以运行。为了兼容这些平台,android从1.6开始,加入了设备独立像素,dip或者dp。标准屏幕480*320上,px与dp是1比1的。分辨率高的,比如800*480,就要按比例兑换成480*320。开发者在开发的时候,ui设计时最好用dp,系统会自动按比例计算为px,从而适配视图。sp我一直以为是跟dp一样的,今天一查,估计是专门配置字体大小的。不过,这个问题不是很大,dp也是可以的。dpi是屏幕像素密度。就是1英寸上像素点的个数。对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚。比如iphone4的视网膜级的屏幕肯定比iphone 3gs的屏幕像素密度高的多。 对于开发者来说,这个不是很重要。都是自己的一些体会。关于根源你可以看看开发者文档,那里面有详细的解释。
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看
的源码可知 Android 默认使用 sp 作为字号单位。
在 Android 中,
1pt 大概等于 2.22sp
以上供参考,如果 UI 能够以 sp 为单位提供设计是最好的,如果设计中没有 sp
的概念,则开发人员也可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。
与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图
已有帐号?
社交帐号登录
无法登录?
社交帐号登录

我要回帖

更多关于 dp sp px dip 的文章

 

随机推荐