常規的我們可能只考慮QVGA,HVGA,WVGA,FWVGA和DVGA,但是拋去了手機不談,可能平板使用類似 WSVGA的1024x576以及WXGA的1280x768等等。
QVGA = 320 * 240;
WQVGA = 320 * 480;
WQVGA2 = 400 * 240;
WQVGA3 = 432 * 240;
HVGA = 480 * 320;
VGA = 640 * 480;
WVGA = 800 * 480;
WVGA2 = 768 * 480;
FWVGA = 854 * 480;
DVGA = 960 * 640;
PAL = 576 * 520;
NTSC = 486 * 440;
SVGA = 800 * 600;
WSVGA = 1024 * 576;
XGA = 1024 * 768;
XGAPLUS = 1152 * 864;
HD720 = 1280 * 720;
WXGA = 1280 * 768;
WXGA2 = 1280 * 800;
WXGA3 = 1280 * 854;
SXGA = 1280 * 1024;
WXGA4 = 1366 * 768;
SXGAMINUS = 1280 * 960;
SXGAPLUS = 1400 * 1050;
WXGAPLUS = 1440 * 900;
HD900 = 1600 * 900;
WSXGA = 1600 * 1024;
WSXGAPLUS = 1680 * 1050;
UXGA = 1600 * 1200;
HD1080 = 1920 * 1080;
QWXGA = 2048 * 1152;
WUXGA = 1920 * 1200;
TXGA = 1920 * 1400;
QXGA = 2048 * 1536;
WQHD = 2560 * 1440;
WQXGA = 2560 * 1600;
QSXGA = 2560 * 2048;
QSXGAPLUS = 2800 * 2100;
WQSXGA = 3200 * 2048;
QUXGA = 3200 * 2400;
QFHD = 3840 * 2160;
WQUXGA = 3840 * 2400;
HD4K = 4096 * 2304;
HXGA = 4096 * 3072;
WHXGA = 5120 * 3200;
HSXGA = 5120 * 4096;
WHSXGA = 6400 * 4096;
HUXGA = 6400 * 4800;
SHV = 7680 * 4320;
WHUXGA = 7680 * 4800;
必須要在androidmainfest中進行如下代碼的配置:
< supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
如果沒有這幾行代碼,不管你怎麼調整layout中的控制項,對應解析度的手機是沒有任何效果的。注意:由於android版本的不同,有些版本不支援xlargeScreens,可以直接將android:xlargeScreens="true"去掉。
關於手機解析度相關術語和概念
螢幕尺寸:實際的物理尺寸,螢幕的對角線測量。為了方便,android把所有的螢幕尺寸分為了4個廣義的大小:小,正常,大,特大。
螢幕密度:螢幕的物理面積內像素的數量,通常稱為DPI(DPI)。為了方便,android把所有的實際螢幕密度分為:低,中,高,特高。
方向:從使用者的角度來看,就是螢幕的方向,就是橫向或者縱向的意義。
解析度:螢幕上面的物理像素總數。(官方說法,應用程式應該只關注螢幕大小和密度)
密度無關像素: 一個虛擬像素單元(官方說法,你應該使用密度無關像素定義UI的布局,來表達布局尺寸或位置,系統預設假設“中等”的密度螢幕為基準,其螢幕密度相當於一個160dpi的螢幕。在運行時,系統根據實際中的螢幕密度對DP單位進行縮放。DP單位轉換為螢幕像素可用PX = DP *(DPI / 160)這個方法。那麼在一個160dpi螢幕上,1DP==1PX。在一個240 dpi螢幕上,1 DP==1.5PX。那麼在定義布局時,應該使用DP單位,以確保不同密度的螢幕上合理的顯示使用者介面)
關於支援螢幕的範圍
官方定義4種廣義尺寸:小,正常, 大,更大。四種密度:低,中型, 高,特高。廣義尺寸和密度都可以跨越一系列的尺寸和密度(官方上傳不了許可權不夠一周<img title=”[android 螢幕適配]關於android解析度相容問題(一)[轉]” src=”http://static.blog.csdn.net/xheditor/xheditor_emot/default/wronged.gif” alt=”委屈” />)
關於密度的獨立性
官方說法保證密度的獨立性是非常重要的,如果沒有它,你應用程式中的系統控制項可能會在物理尺寸相同,密度不同的螢幕上面顯示異常。
Android系統協助密度獨立有兩種方式:
1.使用DP單位。
2.位元影像資源縮放,可以導致像素模糊的位元影像,可以根據當前螢幕密度,提供不同解析度的位元影像。官方提示,如果提供一套圖至少提供更高解析度高密度的位元影像而不是提供哪些中等密度設計的位元影像。
關於如何支援多個螢幕
官方說法確保系統在適配多個螢幕做了很多工作,但是為了更妥善處理不同的螢幕配置,我們也需要做些工作:
1.在程式中顯示聲明你的應用程式支援螢幕尺寸的清單。
<span style=”font-family:KaiTi_GB2312;font-size:16px;”>
android:resizeable=[“true”|”false”]
android:smallScreens=[“true”|”false”]
android:normalScreens=[“true”|”false”]
android:largeScreens=[“true”|”false”]
android:xlargeScreens=[“true”|”false”]
android:anyDensity=[“true”|”false”]/></span>
2.根據不同螢幕尺寸,提供不同布局
預設情況下面,android會自動調整應用程式的布局,但是大多數情況下面,根據廣義尺寸,小,正常,大,更大去增加不同的布局資源。比如,如果需要對大小為large的螢幕提供支援,需要在res目錄下建立一個檔案夾layout-large/並提供layout。當然,也可以在res目錄下建立layout-port和layout-land兩個目錄,裡面分別放置豎屏和橫屏兩種布局檔案,以適應對橫屏豎屏自動切換。
3.提供不同的螢幕密度和不同的位元影像drawables
預設情況下面系統會自動調整和縮放位元影像,但是難免展開位元影像,為了保證你的位元影像是最好看的,根據廣義密度,低,中型, 高,特高去添加不同的位元影像資源。比如,如需對密度為low的螢幕提供合適的圖片,需建立檔案夾drawable-ldpi/。應盡量使用點9格式的圖片,圖片大小的確定:low:medium:high:extra high比例為3:4:6:8。舉例來說,對於中等密度(medium)的螢幕你的圖片像素大小為48×48,那麼低密度(low)螢幕的圖片大小應為36×36,高(high)的為72×72,extra high為96×96。
關於系統怎麼動態尋找替代資源?
1.系統根據當前的螢幕大小和密度,然後動態採用程式中提供特定的資源。
2.如果沒有匹配的資源,系統會使用預設的資源進行縮放從而符合當前螢幕的資源,“預設”的資源是那些沒有標籤配置限定符。
(這塊只是簡單的說法,詳細關於介紹尋找替代資源下章在說吧)
關於系統的資源配置的目錄(我只列出一些大概,預設項目會有一些資源配置目錄)
Android系統支援多配置資源檔,我們可以追加新的資來源目錄到你的Android項目中。命名規範: 資源名字-限制符
註:如果沒有指定橫屏或豎屏,則上面的布局和位元影像都適配橫豎屏。如果要指定橫屏,例如:drawable-land-hdpi豎屏drawable-port-hdpi,還有關鍵是drawable-xlarge和layout-xlarge,對api level都要求在9之上,等於說,你用android2.2系統的平板或者手機根本不匹配layout-xlarge。因為api level是8。drawable-tvadpi這個api等級需要13以上。
其實上面的layout-large這個目錄其實是個範圍。當系統根據當前螢幕的大小和密度,決定程式應該匹配那個目錄。你也可以單獨定製某些不符合Google標準的山寨版layout-l024x600(中間的符合是英文下的x字母),其中1024和600的單位是dp。你可以根據你裝置的解析度和密度,來判斷你的裝置需要定義那個檔案。
但是,官方推薦使用尺寸來表示資源layout-large,不推薦使用解析度layout-1024*600。
建議大家多看文檔,官方說明:
xlarge screens are at least 960dp x 720dp
large screens are at least 640dp x 480dp
normal screens are at least 470dp x 320dp
small screens are at least 426dp x 320dp
上面是定義廣義大小布局資源適配的一個範圍,大家可以根據自己的裝置知道系統會匹配那個檔案的布局。
如果手上有個山寨華為的賣的比較火的mediapad,大家知道解析度1280*800 密度尺寸7寸
通過勾股定了和解析度可以得出其密度為215.69。然後根據dp=px/(dpi/160),可以得出個範圍593.471。所以這個裝置系統會匹配layout-large這個資源布局檔案。
|
螢幕類型 |
解析度 |
密度 |
尺寸 |
drawable-hdpi |
WVGA |
480*800 |
240 |
大 |
drawable-ldpi |
QVGA |
240*320 |
120 |
小 |
drawable-mdpi |
HVGA |
320*480 |
160 |
中 |
1、基本概念
螢幕大小(screen size) – 螢幕的實際大小,用螢幕對角線長度來衡量(比如3.4寸,3.8寸)。android把螢幕分為以下4種:small,normal,large,extra large。
怎麼判斷?
螢幕密度(Screen Density) - 一塊實際的螢幕地區有多少個像素,一般用dpi衡量(每英寸有多少個點)。相比起medium、high螢幕密度的裝置,在一塊確定大小的螢幕地區l密度為low的螢幕擁有的像素更少。android把螢幕密度分為4種:low,medium,high,extra high。
如何判斷是ldpi,mdpi,hdpi?
方向(orientation) - 螢幕方向分為landscape(橫屏)和portrait(豎屏)。
解析度(Resolution) - 螢幕上的總實際像素數。對螢幕進行適配時,一般不關注它的解析度,只關注它的螢幕大小和密度。
與密度無關的像素(Density-independent pixel,dp或dip) - 為了保證你的UI適合不同的螢幕密度,建議你採用dp來定義程式UI。
它的計算方法為:px = dp * (dpi / 160)
sp(scale-independent pixel)
如何分辨一個螢幕是ldpi、mdpi、hdpi的方法,見
計算螢幕密度
2、怎樣適配多種螢幕
a.在manifest裡定義你的程式支援的螢幕類型,相應代碼如下:
<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"] //是否支援小屏
android:normalScreens=["true" | "false"] //是否支援中屏
android:largeScreens=["true" | "false"] //是否支援大屏
android:xlargeScreens=["true" | "false"] //是否支援超大屏
android:anyDensity=["true" | "false"] //是否支援多種不同密度的螢幕
android:requiresSmallestWidthDp=”integer”
android:compatibleWidthLimitDp=”integer”
android:largestWidthLimitDp=”integer”/>
b.對不同大小的螢幕提供不同的layout。
比如,如果需要對大小為large的螢幕提供支援,需要在res目錄下建立一個檔案夾layout-large/並提供layout。當然,也可以在res目錄下建立layout-port和layout-land兩個目錄,裡面分別放置豎屏和橫屏兩種布局檔案,以適應對橫屏豎屏自動切換。
c.對不同密度的螢幕提供不同的圖片。
應盡量使用點9格式的圖片,如需對密度為low的螢幕提供合適的圖片,需建立檔案夾drawable-ldpi/,並放入合適大小的圖片。相應的,medium對應drawable-mdpi /,high對應drawable-hdpi/,extra high對應drawable-xhdpi/。
圖片大小的確定:low:medium:high:extra high比例為3:4:6:8。舉例來說,對於中等密度(medium)的螢幕你的圖片像素大小為48×48,那麼低密度(low)螢幕的圖片大小應為36×36,高(high)的為72×72,extra high為96×96。
不同密度的螢幕對應的圖片比例
3、多螢幕適配的4條黃金原則
a.在layout檔案中設定控制項尺寸時應採用wrap_content,fill_parent和dp。
具體來說,設定view的屬性android:layout_width和android:layout_height的值時,wrap_content,fill_parent或dp比pix更好。相應地,為了使文字大小更好的適應螢幕應該使用sp來定義文字大小。
b.在程式的代碼中不要出現具體的像素值。
為了使代碼簡單,android內部使用pix為單位表示控制項的尺寸,但這是基於當前螢幕基礎上的。為了適應多種螢幕,android建議開發人員不要使用具體的像素來表示控制項尺寸。
c.不要使用AbsoluteLayout(android1.5已廢棄) 。相應地,應使用RelativeLayout。
d.對不同的螢幕提供合適大小的圖片。見上面第2部分。
4、需要注意的地方
以上設定適用於android3.2以下的版本。(本人目前開發是在android2.2上,這部分以後再補充)
5、怎樣測試你的程式是否支援多螢幕適配
一般使用AVD Manager建立多個不同大小的模擬器,如