首先我們來了解一些基本元素:
px:像素,屏幕上的點。
dpi:一英寸長的直線上的像素點的數量,即像素密度。標准值是160dp。
/**
* 正是因為dpi值其代表的特性,所以android項目的資源文件下存在以下目錄:
drawable-ldpi ( 當dpi為120時,使用此目錄下的資源)
drawable-mdpi ( 當dpi為160時,使用此目錄下的資源)
drawable-hdpi ( 當dpi為240時,使用此目錄下的資源)
drawable-xhdpi ( 當dpi為320時,使用此目錄下的資源)
drawable-xxhdpi ( 當dpi為480時,使用此目錄下的資源)
Android正是根據設備DPI值得不同,選擇清晰度不同的資源使用,完成屏幕的適配。
*/
dp(dip):獨立像素密度。即在標准屏幕下,1個像素點的長度,標准屏幕是160dpi,可以理解為1英寸長度上有160個像素。標准屏幕中1dp=1px。
px(像素) = dp(獨立像素密度) * (dpi(像素密度) / 160)
分辨率:屏幕上長寬方向上像素點的數量,即一個屏幕上像素的數量。
例如:720*1280 = 屏幕x軸上有720個像素,屏幕y軸上有1280個像素
分辨率單位:dpi(點每英寸)、lpi(線每英寸)、ppi(像素每英寸)
屏幕的物理尺寸:屏幕對角線的長度,單位是inch
sp:專用於設定文字大小,受dpi影響和用戶的字體偏好設定影響。
下面我們來計算屏幕dp:
1 DisplayMetrics metrics = new DisplayMetrics(); 2 getWindowManager().getDefaultDisplay().getMetrics(metrics); 3 int screenHeight = metrics.heightPixels;//屏幕高度像素
4 int screenWidth = metrics.widthPixels;//屏幕寬度像素 5 //density = densityDpi / 160
6 float density = metrics.density;// "屏幕密度"(0.75 / 1.0 / 1.5)
7 int densityDpi = metrics.densityDpi;// 屏幕密度dpi(120 / 160 / 240)每一英寸的屏幕所包含的像素數.值越高的設備,其屏幕顯示畫面的效果也就越精細 8 // 屏幕寬度算法:屏幕寬度(像素)/"屏幕密度" px = dp * (dpi / 160)
9 int height = (int) (screenHeight / density);//屏幕高度dp
但是,需要注意的是,在一個低密度的小屏手機上,僅靠上面的代碼是不能獲取正確的尺寸的。比如說,一部240x320像素的低密度手機,如果運行上述代碼,獲取到的屏幕尺寸是320x427。因此,研究之后發現,若沒有設定多分辨率支持的話,Android系統會將240x320的低密度(120)尺寸轉換為中等密度(160)對應的尺寸,這樣的話就大大影響了程序的編碼。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens節點,具體的內容如下:
1 <!-- 得到屏幕正常的物理尺寸 --> 2 <supports-screens 3 android:anyDensity="true" 4 android:largeScreens="true" 5 android:normalScreens="true" 6 android:resizeable="true" 7 android:smallScreens="true" />
這樣的話,當前的Android程序就支持了多種分辨率,那么就可以得到正確的物理尺寸了。