android里px、dip、dp、dpi的关系

 有一段日子,关系像素的问题一直困扰着我,理不清他们之间的关系,直到在网上查阅了很多相关知识后,才有了

比较清楚的认识,感谢度娘!现作为笔记写下来,也希望能对别人有所帮助。

px:平常所说的1920×1080说的是像素数量,也就是1920px×1080px,代表手机高度上有1920个像素点,宽度上

1080个像素点。我们在做android ui开发时不建议使用px单位,因为同样100px的图片,在不同手机上显示的际大小

可能不同。

dpi:像素密度。假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在

这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部

手机的像素密度,像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。横向和纵向的这个值都是相同的,原因

是大部分手机屏幕使用正方形的像素点。Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)

和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一

个长度为“80dp”的图片,那么它在240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px。

如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果。

dp和dip:一样的概念。其实dp就是为了使得开发者设置的长度能够根据不同屏幕(分辨率/尺寸也就是dpi)获得不同的像

数数量(px)。如:我将一个控件设置长度为1dp,那么在160dpi上该控件长度为1px,在240dpi的屏幕上该控件的长度为

1*240/160=1.5个像素点,也就是dp会随着不同屏幕而改变控件长度的像素数量。记住一点,dp最终都要化为像素数量来衡

量大小的,因为只有像素数量最直观。我们在做ui时一般就得使用dp作为单位。

sp:与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义

文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超

大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。

也就是说sp是用来指定字体的大小。

 dp转px:对于android 来说,最终我们能读懂或者衡量的都是px,所以最后我们都将dp化为px好理解一点。我总结了dp转

px的公式:dp值×(当前dpi/160dpi)= 当前的像素数目。 那么“当前dpi”怎么知道是多少呢?当然也有方法的,我们可以写代

获得:

  

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

int densityDpi = dm.densityDpi; //当前dpi:120/160/240/320

float density = dm.density;    //0.75/1.0/1.5/2.0

也可以用dp值×density得到px的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章