android分辨率屏幕適配

常規的我們可能只考慮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(每英寸點數)。爲了方便,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這個目錄其實是個範圍。當系統根據當前屏幕的大小和密度,決定程序應該匹配那個目錄。你也可以單獨定製某些不符合谷歌標準的山寨版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創建多個不同大小的模擬器,如下圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章