Android 中的长度单位的理解 dp、sp、px、pt
以下是我的自己的理解:
px:表示屏幕实际的象素, 就是屏幕上一个一个的点,像素并不能表示真实的尺寸,一个像素有可能很大(例如在投影仪的屏幕上),也有可能很小(如在手机上)。
pt:表示一个点,是屏幕的真实物理尺寸,常用于印刷。大小为1英寸的1/72. 在Photoshop 上, 默认设置是72像素/英寸, 所以在这种情况下,1pt = 1px.
dp:也写作dip, 他两都是一个意思。它Android 自己抽象出来的单位, 我的理解是,它其实跟真实物理尺寸是一致的,它与像素无关,与屏幕密度(下面解释)无关。
densityDpi: 屏幕密度,对应于PC领域的DPI, 也就是一英寸里有多少个像素。标准的是160, 所以在density=160时,1dp = 1px, density=240时, 1dp = (240/160) px = 1.5px.
density:上面的比例因子1.5 就是density
sp: 这个用于Android 的字体大小,其实跟pt的含义也是类似的,也是可以表达真实的物理尺寸,只是它适用在手机上,指的是标准情况(density=160)下一个“点”的大小。它和pt有个换算关系, 1sp = (72/160)pt, 为啥是72/160呢? 因为:在标准情况下,PC上1英寸有72个像素,也就有72个pt,而手机上的标准是,1英寸有160个像素。所以160sp = 72pt,1sp = (72/160)pt = 0.45pt;
由上面可以看出,从物理尺寸大小的角度来说,1dp 其实就是1sp。
还有一点值得注意的就是,我们平常提到“分辨率”这个词, 分辨率高,并不意味着越清晰(还要看图像尺寸嘛,如果是投影仪的屏幕1024*768, 当你走进去看的时候,每个点其实也是很大,并不清晰的)。
----------
通过以下代码,我们可以获得设备的屏幕相关信息:
2 String infoStr = "";
3 if (dm == null) {
4 dm = new DisplayMetrics();
5 activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
6 }
7 int width = dm.widthPixels;
8 int height = dm.heightPixels;
9 float density = dm.density;
10 int densityDpi = dm.densityDpi;
11 float xDpi = dm.xdpi;
12 float yDpi = dm.ydpi;
13 float scaledDensity = dm.scaledDensity;
14 infoStr = "ScreenInfo [width=" + width + ", height=" + height + ", density=" + density + ", densityDpi="
15 + densityDpi + ", xDpi=" + xDpi + ", yDpi=" + yDpi + ", scaledDensity=" + scaledDensity + "]";
16 XLLog.d("XunleiKankan", infoStr);
17 return infoStr;
18 }
width=480, height=854, density=1.5, densityDpi=240, xDpi=234.46153, yDpi=233.24301, scaledDensity=1.5