移動設備有大有小,那么如何適應不同屏幕呢,這給我們編程人員造成了很多困惑。我也是突然想到這些問題,然后去網上搜搜相關東西,整理如下。
首先,對下面這些長度單位必須了解。
Android中的長度單位詳解(dp、sp、px、in、pt、mm)
看到有很多網友不太理解dp、sp和px的區別:現在這里介紹一下dp和sp。dp也就是dip。這個和sp基本類似。如果設置表示長度、高度等屬性時可以使用dp 或sp。但如果設置字體,需要使用sp。dp是與密度無關,sp除了與密度無關外,還與scale無關。如果屏幕密度為160,這時dp和sp和px是一 樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設還是3.2寸),而屏幕密度變成了320。那么原來TextView的寬度 設成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設置成160dp或160sp的話。系統會自動 將width屬性值設置成320px的。也就是160 * 320 / 160。其中320 / 160可稱為密度比例因子。也就是說,如果使用dp和sp,系統會根據屏幕密度的變化自動進行轉換。
下面看一下其他單位的含義
px:(pixels)(像素):屏幕上的點,與密度相關。密度大了,單位面積上的px會比較多。表示屏幕實際的象素。例如,320*480的屏幕在橫向有320個象素,在縱向有480個象素。
dip或dp(與密度無關的像素)。這個和設備硬件有關,為了支持WVGA、HVGA和QVGA 5進制空間推薦使用這個。一種基於屏幕密度的抽象單位。設置一些view的寬高可以用這個,一般情況下,在不同分辨率,都不會有縮放的感覺。如果用px的話,320px占滿HVGA的寬度,到WVGA上就只能占一半不到的屏幕了,那一定不是你想要的。
sp(與刻度無關的像素)放大像素– 主要處理字體的大小。
sp(與刻度無關的像素)放大像素– 主要處理字體的大小。
in:表示英寸,是屏幕的物理尺寸。每英寸等於2.54厘米。例如,形容手機屏幕大小,經常說,3.2(英)寸、3.5(英)寸、4(英)寸就是指這個單位。這些尺寸是屏幕的對角線長度。如果手機的屏幕是3.2英寸,表示手機的屏幕(可視區域)對角線長度是3.2*2.54 = 8.128厘米。讀者可以去量一量自己的手機屏幕,看和實際的尺寸是否一致。
mm:表示毫米,是屏幕的物理尺寸。
pt:表示一個點,是屏幕的一個物理長度,大小為1英寸的1/72。
換算公式:
px = (density/160)dp
density一般為3個常用固定值240/160/120
density一般為3個常用固定值240/160/120
分別對應WVGA/HVGA/QVGA
不知道知己做的分辨率對應的density是多少可以點擊AVD Manager里新建一個模擬器或者選擇已有的模擬器點details就可以看到了(1.6以上包括1.6才可以查)
補充:dp跟dip是一樣的,但px跟dp(dip)絕對不一樣,唯一的情況只有在HVGA分辨率下才是一樣,因為HVGA分辨率對應density為160,與除數一樣,所以做的時候才會沒感覺到差別
其次,我們在創建一個模擬器的時候,有一個選項是選擇模擬器的大小,其實就是選擇模擬器的屏幕大小,就是我們常說的分辨率。比如:320*48等。
Density的意思是“密度”。密度,就是說單位面積內的容量大小。
HVGA屏density=160
QVGA屏density=120
WVGA屏density=240
WQVGA屏density=120
QVGA屏density=120
WVGA屏density=240
WQVGA屏density=120
density值表示每英寸有多少個顯示點,與分辨率是兩個概念。
不同density下屏幕分辨率信息:
480*800的WVGA(density=240)
density=120時 屏幕實際分辨率為240*400 (兩個點對應一個分辨率)
橫屏是屏幕寬度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
density=120時 屏幕實際分辨率為240*400 (兩個點對應一個分辨率)
橫屏是屏幕寬度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
屏幕 寬度 高度 尺寸 大小 密度
Type (Pixels) (Pixels) Range (inches) Size Group
QVGA 240 320 2.6 - 3.0 Small Low
WQVGA 240 400 3.2 - 3.5 Normal Low
FWQVGA 240 432 3.5 - 3.8 Normal Low
HVGA 320 480 3.0 - 3.5 Normal Medium
WVGA 480 800 3.3 - 4.0 Normal High
FWVGA 480 854 3.5 - 4.0 Normal High
WVGA 480 800 4.8 - 5.5 Large Medium
FWVGA 480 854 5.0 - 5.8 Large Medium
屏幕大小和密度對照表 :
<ignore_js_op>

下面是在manifest中設置app在不同分辨率時,是否支持多密度的方法。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
< /manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
< /manifest>
<ignore_js_op>

3
、位圖資源的縮放
當對位圖資源進行縮放處理時,充分考慮設備的高度和寬度,在程序運行時獲取設備的高度和寬度代碼如下:
1 2 3 4
|
WindowManager mWMgrmWMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);int width = mWMgr.getDefaultDisplay().getWidth();
int height – mWMgr.getDefaultDisplay().getHeight();
|
下面列舉一些強烈推薦的建議:
-
在XML布局,使用wrap_content和fill_parent來填充整個父窗口;
-
使用FrameLayout,而不是AbsoluteLayout,減少界面布局對屏幕大小的依賴;
-
NEVER use hard-coding for pixel value, use dip (density independent pixel);
-
根據density和resolution 為不同的設備准備合適的圖片資源。