Android像素单位dp、sp、px、pt的区别和比较

来源:互联网 发布:linux jdk 安装 编辑:程序博客网 时间:2024/05/29 17:45

目录结构

  • 目录结构
  • 前言
  • 度量单位含义
  • 换算规则


前言

在分辨率没有牛逼到爆的过去,程序员通常以像素为单位设计计算机用户界面。例如,图片大小为80×32像素。这样处理的问题在于,如果在一个每英寸像素点数更高的新显示器上运行该程序,则用户界面图标会显得很小。在有些极端情况下,用户界面会小到难以看清内容。因为我们在Android应用程序开发中应使用与分辨率无关的度量单位。

Android支持dp、sp、px、pt等各种度量单位,下面介绍一下它们的概念和区别。


度量单位含义

dip (dp)
device independent pixels(设备独立像素)。不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA,HVGA和QVGA推荐使用这个,不依赖像素。
px
pixels(像素)不同设备显示效果相同。
sp
scaled pixels(放大像素)主要用于字体显示(best for textsize)。
in
英寸,长度单位。
pt
point,是一个标准长度单位,1pt = 1/72英寸,用于印刷业。

换算规则

这里的换算规则主要是介绍px、dp、sp的换算规则。
从UI设计师和开发工程师的角度理解:

px(像素)是UI设计师在PS里使用的,同时也是手机屏幕上所显示的。
dp是开发工程师写layout的时候使用的尺寸单位,sp是开发写layout时关于字体的字号单位,且dp与sp总为1:1关系。

所以,UI设计师给出效果图时,标记的单位如果是dp或者sp,开发工程师就可以直接写Layout布局xml文件了。但是,如果UI设计师给出的单位是像素(px),那苦逼的开发工程师就要自行换算了。

在了解具体的换算规则之前,我先介绍一个概念,像素密度。
假设有一部手机,屏幕的物理尺寸为1.5英寸*2英寸,屏幕分辨率为240*320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。

由于不同的手机或平板有不同的像素密度,而开发人员不可能为每款不同像素密度的手机开发相同的应用,因此Android想到了这点,Android系统本身定义了六种像素密度:

低(120dpi)、中(160dpi)、高(240dpi)、超高(320dpi)、超超高(480dpi)

由于在160dpi像素密度的情况下:px = dp,当在其他像素密度时,pxe和dp的换算规则是:dp=(int)(px/1.5+0.5)
因为,在低、中、高、超高、超超高像素密度下,dp到px的换算系数分别为:

低(0.75)、中(1)、高(1.5)、超高(2)、超超高(3)

有了这个换算系数后,那假设UI设计师在在超高像素密度(xh)的手机上给你200px像素值宽度时,那你写在xml里对应的dp应该为:100dp
dp和px的代码转换方法如下:

public static int dpTopx(Context context, float dpValue){    final float scale = context.getResources().getDisplayMetrics().density;    return (int)(dpValue * scale + 0.5f);}public static int pxTodp(Context context, float pxValue){    final float scale = context.getResources().getDisplayMetrics().density;    return (int)(pxValue / scale + 0.5f);}
0 0
原创粉丝点击