android 尺寸 dp,sp,px,dip,pt详解


  Android布局和字体大小等不可避免会使用到尺寸,在android中经常会用到如dpsppx等。但是他们的具体含义,可能大多数使用者都不清楚,所以本人做个小小的总结。


在介绍之前,必须对几个参数有所了解,dpi/DENSITY_DEVICE(屏幕密度),即是1英寸里有多少个px,多少个点。Pt,是一个标准长度,长度为1/72英寸。不言而喻,ptpx的关系为:

1pt = dpi/72(px)   (公式一)

DENSITY_DEFAULT,默认密度,其大小默认为160,这也是为什么网上很多资料拿这个值作为DENSITY_DEVICE的特殊值。

Px:像素,这个比较简单,指屏幕上的点,不同设备的效果是一样的,比如你的手机是320*480的像素,则代表横向有320px。当然这个就与密度有关,体现为分辨率。相同尺寸的手机,分辨率越大,其横向的px尺寸也就越大。但是要注意前提是相同尺寸的手机。

Spscaled pixels(放大像素),关于sp网上有很多资料,但是看完都是一个效果,看了还是不知道这是个什么东东。我们通过下面的转换来理解:

1sp = scaledDensity *px

其中scaledDensity是关键,其默认值为 DENSITY_DEVICE/(float)DENSITY_DEFAULT。将上面的关系全面化如下:

1sp = (DENSITY_DEVICE /(float)DENSITY_DEFAULT)(px) (公式二)

默认为:1sp = DENSITY_DEVICE /160 px (公式二)

当密度取特殊的160时,1sp = 1px

相信大家看到这里就更糊涂了,有的文章不是说sp是与密度和字体缩放度无关的么,这么一看,这不是和密度成正比么,但是别忘了px不是物理尺寸,pt才是,综合公式一、公式二,你会发现sppt的关系:

1pt 大约等于 2.22sp (公式三)

所以这就是为什么所有人都只记得那句话里那部分“best for textsize”,用于字体尺寸。对于同一个应用,不管我们用的是多大的手机或者平板电脑,对字体大小要求并不严格(虽然有点牵强,毕竟google官方是这么建议的。。。。。)。

Dip:全称为device independent pixels(设备独立像素)。这个是与硬件相关的,不同的设备效果是不一样的,不依赖于像素。

Dpdip是一样的,为什么,我现在还不清楚,欢迎大牛们给予解答。我们还是通过转换公式来理解:

1dip  = density*px

而默认的density为:

DENSITY_DEVICE/(float)DENSITY_DEFAULT

默认的话:1dp = DENSITY_DEVICE/160 px (公式四)

从而也就有 1pt 大约等于 2.22sp,也就有1sp = 1dp

这个和sp 貌似一样了,是不是有点恍然大悟,所以有的时候你用sp也行,用dp也行,那是因为这些参数都用的默认值。切记,这里取的默认值,如果因为某种特别需求,需要定义这些参数,那么到时候出现的效果就会不一样,二关键就在 density 和 scaledDensity。这俩参数都是DisplayMetrics

类的属性。

另外这里还需要特别注意的是上面的公式除了公式一,其它都是通过了四舍五入得到的,所以不是精准的。随着值的改变,可能你会发现他们并不是严格按这个规律来的。看看下面的这个转换代码你就明白了。

主程序1

android 尺寸 dp,sp,px,dip,pt详解

资源文件dimens

android 尺寸 dp,sp,px,dip,pt详解


效果图:

android 尺寸 dp,sp,px,dip,pt详解


是不是发现t2 和 t3 分别设置的是16dp 和 16sp,不一样了,原因相信也应该明白是怎么回事了。

在实际的anrdoid开发中,关于尺寸,尽量不要在布局文件或者程序里定义,最好是卸载values下的demens里,这样方便管理,要不维护起来非常的困难。


下面我们再来讨论一些常识性问题,分辨率和屏幕密度毫无疑问是不同的概念,分辨率是整个屏幕有多少个点,比如800*400,它的单位是px。而屏幕密度是1英寸有多少个显示点,虽然这单位也是px。看一个手机屏幕的好坏,准确地应该看屏幕密度,但是如果尺寸都差不多,当然分辨率越高,屏幕密度也就越高。

Androd中常用的有以下几种屏幕:

android 尺寸 dp,sp,px,dip,pt详解

另外我们常说的手机是几寸的,说的是手机的对角线的长度,而不是边长。电脑、电视也一样,所以总说你的电脑是15寸的,可是自己量出的尺寸总是小。

你可能感兴趣的:(dp,px,SP)