dip
density independent pixel,可翻译成密度无关像素;
也有device independent pixel,设备独立像素。
密度无关,意味着不同屏幕密度下的dip值有相同的表现。
dip曾经是Android开发布局时候的常用单位,但是现在已经被dp所取代(更简洁嘛)。
dpi,ppi
dots per inch,每英寸像素点。 本来是一个印刷行业的术语,dot原指打印的着墨点,在手机上就是像素点了。
ppi: pixels per inch,是指像素(屏幕)密度。
dpi, ppi 是一个设备常量,每个手机出厂的时候就确定了。 一般会选定某个dpi作为应用开发的锚点,或者说基线。
网上有一些计算dpi或者ppi的公式,我个人觉得没什么用,在应用程序里完全不用计算,因为是设备常量,代码中是可以获取的。可以通过context.getResources().getDisplayMetrics().densityDpi
获得。
那手上有一台设备,不用代码怎么知道它的DPI呢?一般来讲PPI是几乎所有手机参数都会提及到的,那就找到设备的PPI,对比以下列表的值,向上找到最接近的DPI值,就是设备的DPI。
◦ldpi (low) ~120dpi
◦mdpi (medium) ~160dpi
◦hdpi (high) ~240dpi
◦xhdpi (extra-high) ~320dpi
◦xxhdpi (extra-extra-high) ~480dpi
◦xxxhdpi (extra-extra-extra-high) ~640dpi
如:设备的PPI是 401,那么往上找到最接近的DPI就是 480,同时也知道了这台设备的屏幕密度就是xxhdpi(该方法不完全正确,因为root过的手机可以修改手机的参数)
sp
scale pixel 缩放像素。 我个人觉得更好的理解是
像素缩放倍数
。
sp通常用于字体大小的设定。dp跟sp的区别在于,sp的值在一个设备上可以有不同表现。通过修改手机中的设置--显示--文字大小
可以变更sp的表现。
px
没啥好说的。
px 与 dp 的转换关系
px = dp * ( dpi / 160 )
在一个 xxhdpi 的布局文件中,有个textView 的宽度为100dp,那显示时宽度将占用多少个像素?
px = 100 * ( 480/160 ) = 300
*BONUS 私货*
代码层面,android绝大多数api都是使用px作为单位,只有在xml布局的时候才使用 dp,sp 。
通常我们通过context.getResources().getDimension()
方法获取的 dp,sp值 都会自动转成 px 单位。
都说字体大小要用sp,有没有例外呢?
当然有,sp值的表现是不稳定的,同一台设备的表现可以不同。
在开发过程中,如果遇到布局比较紧凑,空间宽容度比较小的情况,应该使用dp(px)来设置大小,避免出现用户修改了系统文字大小而使界面兼容性下降,布局错乱的问题。
同理
如果你需要把图片当成文字一样处理的话,那就给图片的大小设置sp值