pixel,即像素,代表屏幕上的一个物理的像素点比如我们说的 1920x1080说的就是1920像素和1080像素。
dpi
dots per inch,每英寸的像素数,也就是屏幕密度,它的计算公式是:
,这里的长和宽指的是屏幕分辨率,比如一个1902x1080的5英寸手机,它的dpi就是:
=440.5814340200 ,这个数值有什么意义呢?其实它对应着下面的dp(dip)与像素间的换算关系,对于Android手机来说,常见的dpi有如下几种:
- ldpi:dpi范围为0 ~ 120
- mdpi:dpi范围为120 ~ 160
- hdpi: dpi范围为160 ~ 240
- xhdpi:dpi范围为240~320
- xxhdpi:dpi范围为320~480
在实际开发中,通常以dpi值120、160、240、320、480分别指代ldpi、mdpi、hdpi、xhdpi、xxhdpi。通常屏幕密度越大的手机显示的图像会越细腻。可以通过如下代码获取当前Android设备的屏幕密度:
若我们在一台屏幕密度为320dpi的Android手机上运行以上代码,会得到如下输出:
上面输出中的densityDpi就是Android手机屏幕的dpi值,那么density是什么呢?实际上它代表的是当前屏幕的dpi值与基准dpi值的比值,这个基准dpi值为160。
现在我们已经理解了dpi,接下来让我们揭开dp的神秘面纱。
dp(dip)
device independent pixel,即设备无关像素。之所以与设备无关,是因为它是通过与基准dpi的比例关系转化为要显示的像素点,比如上现的dpi是320,基准值是160,那么1dp=320/160*1=2px,同时我们也可以计算其它dpi下dp与px的关系:
- ldpi:dpi范围为0 ~ 120,1dp=0.75px
- mdpi:dpi范围为120 ~ 160,1dp=1px
- hdpi: dpi范围为160 ~ 240,1dp=1.5px
- xhdpi:dpi范围为240~320,1dp=2px;
- xxhdpi:dpi范围为320~480,1dp=3px
pt
通常用来作为字体的尺寸单位,1 pt相当于1/72英寸。
sp
通常用于设置字体大小的单位,与dp类似,网上大部分博客都有说dp与sp对px的转化关系相同,那为什么还要对字体专门设置一个sp呢?显然它们还是有区别的:
我们先来一起看下TypedValue类中包含的一个用户将dp、sp等单位转换为px的静态方法:
若要将sp转换为px,则会执行如下代码: