本文最后修改于 2020 年 9 月 19 日
又称 dip,Device Independent Pixels(设备独立像素)。
与屏幕尺寸有关。一般来说,同样尺寸的屏幕以 dp 计量的分辨率是一样的,如一般手机屏幕分辨率会设置成 360 dp。可以在开发者选项中手动更改 dp 。
sp 原理与 dp 差不多,是专门用于设置字体大小的。手机设置中可以调整字体大小。以 sp 为单位,更改设置中字体大小,并不会改变 dp 的显示。
Google 推荐使用 sp 设置字体大小并且大于等于 12 sp。
阿里巴巴安卓开发手册推荐字体大小单位设置为 dp,解释为可以更好的还原 UI 设计,不过我觉得还是 sp 更好。
在 XML 布局文件中,为了让不同设备屏幕拥有统一的显示效果,除了 sp 用于设置文字大小外,其余要用尺寸大小的地方几乎都用 dp。在代码中情况又有所不同,Android 用于设置大小的函数都以 px 为单位。无论是 LayoutParams 里的 width 和 height ,还是 setMargins 和 setPadding,参数单位都是 px,要想在代码中使用 dp 设置布局大小或间距,得先把 dp 值转换成 px 值。
Kotlin
import android.content.Context object DimenUtil { fun dp2px(context: Context, dp: Float): Float = dp * context.resources.displayMetrics.density fun px2dp(context: Context, px: Float): Float = px / context.resources.displayMetrics.density }上面的单例类也可以写成 Kotlin 中的顶层函数方便调用。