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, 当你走进去看的时候,每个点其实也是很大,并不清晰的)。

----------

通过以下代码,我们可以获得设备的屏幕相关信息:

 1     public static String logScreenInfo(Activity activity) {
 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

posted @ 2012-02-20 10:36  Stanley.Luo  阅读(1290)  评论(0编辑  收藏  举报