android中像素单位dp、px、pt、sp的比较

来源:互联网 发布:delphi数据库编程实例 编辑:程序博客网 时间:2024/05/21 21:48

最近了解了一下android 的分辨率的问题,搜了一些资料,mark一下.

转自自:http://www.cnblogs.com/chiao/archive/2011/07/07/2100216.html

http://blog.csdn.net/u011904605/article/details/52820281#comments


在实际开发过程中,会遇到不同的机型,为了让控件和布局要在不同屏幕上显示相近的样子,就得在drawable-ldpi/mdpi/hdpi/xhdpi/xxhdpi不同的文件夹下放置图片素材或者在xml中用dp作为间距单位,用sp作为文字的单位。因此要搞清楚他们的关系,否则会很纠结,或者浪费大量的时间调整界面。

概念区分

  • px(pixels)像素,屏幕上的点,不同设备显示效果相同,例如,HVGA代表320×480像素。
  • in(英寸)屏幕的物理尺寸, 每英寸等于2.54厘米。 
    • 例如我们经常说的手机屏幕大小有,5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是4英寸,表示手机的屏幕(可视区域)对角线长度是4 X 2.54 = 10.16厘米。
  • pt(point)标准长度单位, 1pt=1/72英寸,用于印刷业,UI设计师会用,iOS字体单位,Android开发不涉及。
  • dpi(dots per inch) 打印分辨率,每英寸所能打印的点数,即打印精度; 每英寸点数,即每英寸包含像素个数。 
    • 比如320X480分辨率的手机,宽2英寸,高3英寸, 每英寸包含的像素点的数量为320/2=160dpi(横向)或480/3=160dpi(纵向),160就是这部手机的dpi,横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。
  • ppi (pixels per inch)图像分辨率, 像素密度,在图像中, 每英寸所包含的像素数目。
  • density(屏幕密度), density和dpi的关系为 density = dpi/160。density这个概念方便理解不同dpi的倍数关系。
  • dp(也即dip,device independent pixels)设备独立像素,Android特有的单位,与密度无关的像素,基于屏幕密度的抽象单位,在320x480分辨率,同时每英寸160点(dpi = 160)的显示器上,1dp = 1px。
  • sp(scaled pixels)放大像素,与刻度无关的像素,字体单位,可以根据用户的字体大小首选项进行缩放。sp和dp一样,是android开发里特有的单位, 查看TextView的源码可知 Android 默认使用 sp 作为字号单位。以160ppi屏幕为标准,当字体大小为 100%时, 1sp=1px。

为什么要把sp和dp代替px?最简单的原因是他们不会因为ppi的变化而变化,在相同物理尺寸和不同ppi/dpi下,他们呈现的高度大小是相同。也就是说更接近物理呈现,而px则不行。

换算关系

px = dp * (dpi / 160),原来这里的dpi是归一化后的dpi。 
则dp = px / (ppi / 160) 
ppi = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数 
dp*ppi/160 = px。比如1dp x 320ppi/160 = 2px。

疑问:dpi和ppi是不是数值等同的?为何文档中的计算方式对不上?

划分标准

Google官方指定的dpi区分标准(第1列和第2列):

名称像素密度范围屏幕密度图片icon尺寸drawable-ldpippi=120-160density=0.7536*36drawable-mdpippi=160-240density=1(baseline)48*48drawable-hdpippi=240-320density=1.572*72drawable-xhdpippi=320-480density=296*96drawable-xxhdpippi=480-640density=3144*144drawable-xxxhdpippi=640-800density=4192*192

* 小规律:比值(各种屏幕密度的比值) 
ldpi:mdpi:hdpi:xhdpi:xxhdpi:xxxdpi = 0.75:1:1.5:2:3:4 = 3:4:6:8:12:16, 
这个比值乘以12就得到对应屏幕密度手机桌面icon图标大小

Android手机常见尺寸和对应分辨率

  • 摘自网络,有待验证。
4:3尺寸对应分辨率VGA640*480 (Video Graphics Array)-QVGA320*240 (Quarter VGA)-HVGA480*320 (Half-size VGA)mdpiSVGA800*600 (Super VGA)-5:3尺寸对应分辨率WVGA800*480 (Wide VGA)hdpi16:9尺寸对应分辨率FWVGA854*480 (Full Wide VGA)hdpiHD1920*1080 High Definition-QHD960*540hdpi720p1280*720xhdpi1080p1920*1080xxhdpi

部分Android测试机分析

   在项目开发过程中,遇到屏幕很大的手机,结果显示的图标却很小,和预期不一致,例如华为机型MT1-U06。   原因是:真机屏幕的ppi会取和谷歌标准最相近的标准ppi,然后density按照最相近的ppi来定。

以谷歌的标准,按安卓屏幕宽度为例,一般来说480px对应的density是1.5(也就是hdpi)对应320dp,720px对应的density是2.0(也就是xhdpi)对应360dp,1080px对应的density是3.0(也就是xxhdpi)对应360dp;

如果非要拿屏幕ppi说事的话,就是这样,以160ppi为基准,160ppi对应的density是1.0,240ppi对应的density是1.5,320ppi对应的density是2.0…

部分机型屏幕尺寸、分辨率计算:

  • 一加A1001 ,主屏尺寸:5.5英寸,1920×1080像素,测试为xxdpi 
    • ppi = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数 = √(1920² + 1080²) / 5.5 =√ 3686400 + 1166400 /5.5 = √ 4852800 /5.5 = 2202.9 /5.5 =440.6
    • density = dpi/160 = 440.6/160 = 2.75
    • 就近原则,对应dpi为xxdpi,与测试结果一致
  • Nexus 5,屏幕尺寸是4.95英寸,分辨率是1920×1080像素(FHD),测试为xxdpi 
    • ppi = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数 =2202.9 /4.95 =445
    • density = dpi/160 = 445/160 = 2.78
    • 同理,就近原则,对应dpi为xxdpi,与测试结果一致
  • 红米note2 ,主屏:5.5英寸,1920x1080像素,但是测试时选择了xdpi 
    • ppi同一加A1001,本应选择xxdpi,测试却是xdpi
    • 所以,有不确定性
  • 华为MT1-U06,屏幕6.1英寸(机身尺寸:64.8*129*7.69mm),像素1280×720px;对应hdpi 
    • ppi = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数 = √(1280² + 720²) / 6.1 =√ 1638400 + 518400 /6.1 = √ 2156800 /6.1 = 1468.6 /6.1 =240.75
    • density = dpi/160 = 240.75 /160 = 1.5
    • 这个数值,刚刚好是hdpi!
  • 三星galaxy s4 ,主屏:5英寸,1920x1080像素,xxdpi 
    • ppi = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数 =2202.9 /5 =440.6
    • density = dpi/160 = 440.6/160 = 2.75
    • 同理,就近原则,对应dpi为xxdpi,与测试结果一致

回到本节开头的疑惑

   所以,你以为那么大屏幕怎么着是xxhdpi,结果呢?人家只是hdpi。。。所以,屏幕大,真心说明不了神马啊

dp(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 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。

还有, google代码里边所用的单位都是以px为默认单位的.


apk的资源包中,当屏幕density=240时使用hdpi标签的资源

当屏幕density=160时,使用mdpi标签的资源

当屏幕density=120时,使用ldpi标签的资源。

在每英寸160点的显示器上,1dp = 1px。


下面是几种不同单位的相互转换.


public static int dip2px(Context context, float dipValue){ 
final float scale = context.getResources().getDisplayMetrics().density; 
return (int)(dipValue * scale + 0.5f); 

public static int px2dip(Context context, float pxValue){ 
final float scale = context.getResource().getDisplayMetrics().density; 
return (int)(pxValue / scale + 0.5f); 

public static int dip2px(Context context, float dipValue){ 
final float scale = context.getResources().getDisplayMetrics().density; 
return (int)(dipValue * scale + 0.5f); 

public static int px2dip(Context context, float pxValue){ 
final float scale = context.getResource().getDisplayMetrics().density; 
return (int)(pxValue / scale + 0.5f); 
}

下面说下如何获取分辨率:

    在一个Activity的onCreate方法中,写入如下代码:
        DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        int width = metric.widthPixels;  // 屏幕宽度(像素)
        int height = metric.heightPixels;  // 屏幕高度(像素)
        float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5)
        int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)



 

在 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类似,但是可以根据用户的字体大小首选项进行缩放。



VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素;
HVGA:Half-size VGA,即:VGA的一半,分辨率为480×320,像三星盖世Ace S5830就是使用这分辨率;
QVGA:Quarter VGA,即:VGA的四分之一,分辨率为320×240,一般用于小屏手机 像三星盖世Mini S5570就是使用这分辨率;

WQVGA:Wide Quarter VGA,即:扩大的QVGA,分辨率比QVGA高,比VGA低,一般是:400×240,480×272;
WVGA:Wide Video Graphics Array,即:扩大的VGA,分辨率为800×480像素,像三星i9000就是使用这分辨率;

FWVGA:Full Wide VGA ,数码产品屏幕材质的一种,VGA的另一种形式,比WVGA分辨率高,别名 : Full Wide VGA, ,其分辨 率为854×480象素(16:9)。

想了解更多:

http://blog.csdn.net/feiyang877647044/article/details/51315143#comments

http://www.woshipm.com/pmd/176328.html