天天看點

Android的機關及螢幕分辨率

一、常用的機關:相對機關主要有:px、sp、dp

絕對機關主要有:pt、in、mm

二、機關應用總結:一般用相對機關,而不是絕對機關

1、字型的大小一般使用SP,用此機關的字型能夠根據使用者設定字型的大小而自動縮放

2、空間等相對距離一般使用dp(dip),随着密度變化,對應的像素數量也變化,但并沒有直接的相對比例的變化。

3、px與實際像素有關,及與密度有關!dp和sp和實際像素沒有關系,對于一定分辨率但不同密度的螢幕,px機關的應用可能會導緻長度的相對比例的變化。

三、密度與分辨率:

密度值表示每英寸有多少個顯示點,與分辨率是兩個概念。

其螢幕密度标準是:HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120

具體的應用運算關系:假設分辨率是 x*y, 密度為 d, 螢幕實際大小為 a*b那麼關系為 x*y = d * a * b (約等于)

不同density下螢幕分辨率資訊,以480dip*800dip的 WVGA(density=240)為例density=120時 螢幕實際分辨率為240px*400px (兩個點對應一個分辨率)

四、對比總結:

1、在相同密度(即同一實體螢幕)不同分辨率的情況下,與實體密度無關的相對機關sp和dp顯示正常

2、在相同分辨率不同密度的情況下,因為一般情況下,都用的标準密度,是以分析的意義不是很大

其他資料:

px:是螢幕的像素點

in:英寸

mm:毫米

pt:磅,1/72 英寸

dp:一個基于density的抽象機關,如果一個160dpi的螢幕,1dp=1px

dip:等同于dp

sp:同dp相似,但還會根據使用者的字型大小偏好來縮放。

建議使用sp作為文本的機關,其它用dip

針對dip和px 的關系,做以下概述:

HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120

density值表示每英寸有多少個顯示點,與分辨率是兩個概念。

不同density下螢幕分辨率資訊,以480dip*800dip的 WVGA(density=240)為例

density=120時 螢幕實際分辨率為240px*400px (兩個點對應一個分辨率)

狀态欄和标題欄高各19px或者25dip

橫屏是螢幕寬度400px 或者800dip,工作區域高度211px或者480dip

豎屏時螢幕寬度240px或者480dip,工作區域高度381px或者775dip

density=160時 螢幕實際分辨率為320px*533px (3個點對應兩個分辨率)

狀态欄和标題欄高個25px或者25dip

橫屏是螢幕寬度533px 或者800dip,工作區域高度295px或者480dip

豎屏時螢幕寬度320px或者480dip,工作區域高度508px或者775dip

density=240時 螢幕實際分辨率為480px*800px (一個點對于一個分辨率)

狀态欄和标題欄高個38px或者25dip

橫屏是螢幕寬度800px 或者800dip,工作區域高度442px或者480dip

豎屏時螢幕寬度480px或者480dip,工作區域高度762px或者775dip

apk的資源包中,當螢幕density=240時使用hdpi 标簽的資源

當螢幕density=160時,使用mdpi标簽的資源

當螢幕density=120時,使用ldpi标簽的資源。

不加任何标簽的資源是各種分辨率情況下共用的。

布局時盡量使用機關dip,少使用px

下面是幾種不同機關的互相轉換.

public static int dip2px(Context context, float dipValue){

final float scale = context.getResources().getDisplayMetrics().density;

return (int)(dipValue * scale + 0.5f);

}

public static int px2dip(Context context, float pxValue){

final float scale = context.getResource().getDisplayMetrics().density;

return (int)(pxValue / scale + 0.5f);

下面說下如何擷取分辨率:

在一個Activity的onCreate方法中,寫入如下代碼:

DisplayMetrics metric = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metric);

int width = metric.widthPixels;  // 螢幕寬度(像素)

int height = metric.heightPixels;  // 螢幕高度(像素)

float density = metric.density;  // 螢幕密度(0.75 / 1.0 / 1.5)

int densityDpi = metric.densityDpi;  // 螢幕密度DPI(120 / 160 / 240)

這還是挺簡單的, 可是你有沒有在800*480的機器上試過, 是不是得到的寬度是533 ? 因為android剛開始時預設的density是1.0 , 此時你可以再manifest.xml中加入

1.uses-sdk節點, <uses-sdk android:minSdkVersion="4" /> , 表示不sdk1.6以下的機器不能安裝你的apk了.

2.supports-screens 節點.

<supports-screens

android:smallScreens="true"

android:normalScreens="true"

android:largeScreens="true"

android:resizeable="true"

android:anyDensity="true" />

繼續閱讀