0%

dp sp px

dp

Density-independent Pixels 像素无关密度

一个基于屏幕物理密度的抽象的单位。

TA 与 屏幕物理密度/像素密度 相关,对应不同的 density

类型 dpi density
ldpi 120 0.75
mdpi 160 1.0
hdpi 240 1.5
xhdpi 320 2.0
xxhdpi 480 3.0
xxxhdpi 640 4.0

1dp 显示的像素数为 1×densitypx。

sp

Scale-independent Pixels 缩放无关密度

sp 和 dp 很类似,唯一的区别是 Android 系统可以自定义字体尺寸,如果设为 Default,则 1sp = 1dp,如设为 Large ,则 1sp > 1dp。 对应scaledDensity

多用于 文字大小。

px

Pixels 像素

屏幕上一个实际的像素点。

多用于 分割线等。

dpi

Dots Per Inch 每英寸墨点

计算为 像素数 px / 物理尺寸 inch

More

dip

同 dp。

pt

Points

mm

Millimeters 毫米

in

Inchs 英寸

1 inch ≈ 2.54 cm

ppi

Pixels Per Inch 每英寸像素

几乎等同于 dpi。

Resolution

分辨率(Resolution)指的是设备屏幕横向和纵向的像素个数。

示例

Nexus 5X:

1
resources.displayMetrics.toString()
1
DisplayMetrics{density=2.625, width=1080, height=1794, scaledDensity=2.625, xdpi=420.0, ydpi=420.0}

将字体调为 Large:

1
DisplayMetrics{density=2.625, width=1080, height=1794, scaledDensity=3.01875, xdpi=420.0, ydpi=420.0}

屏幕对角线为 5.2 inch

分辨率为 1080 px × 1920 px

像素密度为 420 dpi

转换

1
2
3
4
5
6
7
8
9
10
11
fun View.dp2px(dpValue: Float): Float {
return (dpValue * this.resources.displayMetrics.density + 0.5f)
}

fun View.px2dp(pxValue: Float): Float {
return (pxValue / this.resources.displayMetrics.density + 0.5f)
}

fun View.sp2px(spValue: Float): Float {
return (spValue * this.resources.displayMetrics.scaledDensity + 0.5f)
}

参考

android - What is the difference between “px”, “dip”, “dp” and “sp”? - Stack Overflow

更多资源类型 | Android 开发者 | Android Developers

支持不同的像素密度 | Android 开发者 | Android Developers

[Android问答] px、dp和sp,这些单位有什么区别? - 八进制 - 博客园