詳解Android應用中螢幕尺寸的獲取及dp和px值的轉換

NO IMAGE

獲取螢幕尺寸

通過WindowManager獲取


DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//其中display = getWindowManager().getDefaultDisplay() 獲得了一個DefaultDisplay物件; 然後 display.getMetrics(dm) 把螢幕尺寸資訊賦值給DisplayMetrics dm
//注意:WindowManager有時候需要通過context。getSystemService獲取:WindowManager wm = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);

DisplayMetrics和Display的關係。;

Display指代顯示區域這個物件,它可能是真實的物理螢幕,也可能僅指應用程式的顯示區域,比如在非全屏Activity裡,系統因為有狀態列,因此顯示區域要比物理螢幕要小。DisplayMetrics裡封裝了顯示區域的各種屬性值。檢視原始碼發現,在DisplayMetrics對各個屬性值的註釋都說明為真實的物理尺寸。而且也發現display.getMetrics(dm)這一函式基本在應用在獲取真實螢幕尺寸的時候。記住這一點即好。

注:建構函式DisplayMetrics不需要傳遞任何引數;呼叫getWindowManager()之後,會取得現有Activity的Handle。然後,diplay將取得的寬高維度存放於DisplayMetrics物件中,而取得的寬高維度是以畫素為單位(Pixel),“畫素”所指的是“絕對畫素”而非“相對畫素”。

通過DisplayMetrics物件dm可以獲得如下資訊


width = dm.widthPixels;
height = dm.heightPixels;
xdpi = dm.xdpi;
ydpi = dm.ydpi;
density = dm.densityDpi;
fdensity = dm.density;

將dp和px轉化成對應的px數值的例項:


int padding =4;
padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4,
context.getResources().getDisplayMetrics());

解釋:
padding的單位是:dip, padding的大小是:4

雖然是4dip,但是,不是最終padding的真實單位。

他是通過計算以後,4dp和密度係數相乘得到的一個值,實際上計算出來的padding單位是畫素,也就是它的寬度。在不同dpi的螢幕上,這個值是不一樣的。

即:將dp轉化為px,返回的是一個dp對應的px數值。

如果這裡是COMPLEX_UNIX_SP,就是講sp轉化為dp。

單位間的轉換就用這個方法,可以將其封裝成一個工具方法。

進一步理解:
applyDimension方法是將4畫素轉換為6dp(480×800)、4dp(320×800)、3dp(240×320), 所以返回的值對應不同的解析度(通過getDisplayMetrics就得到了)就是6、4、3

原始碼:


public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}

您可能感興趣的文章:

Android 圖片切換器(dp、sp、px) 的單位轉換器基於Android中dp和px之間進行轉換的實現程式碼android中px和dp,px和sp之間的轉換方法