Android开发中,经常要使用dp做为度量单位,为什么不直接使用px呢?
首先要了解几个基本概念
Screen Size
: 屏幕尺寸,根据对角线度量,一般单位是英寸
英寸
: 1英寸=2.54厘米
px
: 像素,屏幕显示的内容是由一个个点组成的,每一个点就是一个像素
Screen density
: 屏幕密度,度量屏幕上一块物理区域中像素的个数多少,通常用dpi(dot per inch)作为单位,这里的点指像素。可以看出,像素的绝对大小是不定的,密度越高,每一像素所占的面积就越小。
Resolution
: 分辨率,通常所说的1080p,800X400指的就是分辨率,这里的数字指的是每个dimension上像素的个数。
了解了以上知识,就可以解释dp这个概念了。
dp是density-independnt pixel的缩写。字面上解释就是与像素密度(就是前面的Screen density)无关。
那么什么是与像素密度无关呢,为什么要用dp,而不直接使用px呢?
假如有这种情况,一个icon是50X50px,一块4英寸大的屏幕,分辨率为100X100px,那么,这个icon将占屏幕的1/4,如果分辨率为200X200,则占1/16. 可见,一块4英寸的屏幕,只因屏幕密度的不同,最终显示效果差距很大。这样会给用户体验带来很大的负效应。
如果icon的大小(指以像素为单位)能随着屏幕密度的变化自动调整,不就好了么?屏幕密度变大,icon也跟着变大。
这就是dp的作用。
因为icon最终要绘制到屏幕上,所以最终还是以px为度量单位,只是在此之前需要一个转化过程
px = dp * (dpi / 160)
可见,当dpi变大时,px可同比例变大。至于为什么是160,只是选的一个基准,在dpi=160的情况下,dp的大小是和px等同的。