1. 程式人生 > >安卓res裡面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)

安卓res裡面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi)

1、螢幕相關概念 
1.1解析度 
是指螢幕上有橫豎各有多少個畫素 
1.2螢幕尺寸 
指的是手機實際的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 
android將螢幕大小分為四個級別(small,normal,large,and extra large)。 
1.3螢幕密度 
每英寸畫素數 
手機可以有相同的解析度,但螢幕尺寸可以不相同, 
Diagonal pixel表示對角線的畫素值(=),DPI=933/3.7=252 
android將實際的螢幕密度分為四個通用尺寸(low,medium,high,and extra high) 
一般情況下的普通螢幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi 
對於螢幕來說,dpi越大,螢幕的精細度越高,螢幕看起來就越清楚 
1.4密度無關的畫素(Density-independent pixel——dip) 
dip是一種虛擬的畫素單位 
dip和具體畫素值的對應公式是dip/pixel=dpi值/160,也就是px = dp * (dpi / 160) 
當你定義應用的佈局的UI時應該使用dp單位,確保UI在不同的螢幕上正確顯示。 

手機螢幕分類和畫素密度的對應關係如表1所示 

手機尺寸分佈情況(http://developer.android.com/resources/dashboard/screens.html)如圖所示, 

目前主要是以解析度為800*480和854*480的手機使用者居多 
從以上的螢幕尺寸分佈情況上看,其實手機只要考慮3-4.5寸之間密度為1和1.5的手機 

2、android多螢幕支援機制
 
Android的支援多螢幕機制即用為當前裝置螢幕提供一種合適的方式來共同管理並解析應用資源。 
Android平臺中支援一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合適資源。 
指定大小(size-specific)的合適資源是指small, normal, large, and xlarge。 
指定密度(density-specific)的合適資源,是指ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high). 
Android有個自動匹配機制去選擇對應的佈局和圖片資源 
1)介面佈局方面 
根據物理尺寸的大小準備5套佈局: 
layout(放一些通用佈局xml檔案,比如介面頂部和底部的佈局,不會隨著螢幕大小變化,類似windos視窗的title bar), 
layout-small(螢幕尺寸小於3英寸左右的佈局), 
layout-normal(螢幕尺寸小於4.5英寸左右), 
layout-large(4英寸-7英寸之間), 
layout-xlarge(7-10英寸之間) 
2)圖片資源方面 
需要根據dpi值準備5套圖片資源: 
drawable:主要放置xml配置檔案或者對解析度要求較低的圖片 
drawalbe-ldpi:低解析度的圖片,如QVGA (240x320) 
drawable-mdpi:中等解析度的圖片,如HVGA (320x480) 
drawable-hdpi:高解析度的圖片,如WVGA (480x800),FWVGA (480x854) 
drawable-xhdpi:至少960dp x 720dp 
Android有個自動匹配機制去選擇對應的佈局和圖片資源。 
  系統會根據機器的解析度來分別到這幾個資料夾裡面去找對應的圖片。 
  在開發程式時為了相容不同平臺不同螢幕,建議各自資料夾根據需求均存放不同版本圖片。 

3、AndroidManifest.xml 配置
 
android從1.6和更高,Google為了方便開發者對於各種解析度機型的移植而增加了自動適配的功能 
<supports-screens 
android:largeScreens="true" 
android:normalScreens="true" 
android:smallScreens="true" 
android:anyDensity="true"/> 
3.1是否支援多種不同密度的螢幕 
android:anyDensity=["true" | "false"] 
如果android:anyDensity="true" 
指應用程式支援不同密度,會根據螢幕的解析度自動去匹配。 
如果android:anyDensity="false" 
應用程式支援不同密度,系統自動縮放圖片尺寸和這個圖片的座標。具體解釋一下系統是如何自動縮放資源的。 
例如我們在hdpi,mdpi,ldpi資料夾下擁有同一種資源,那麼應用也不會自動地去相應資料夾下尋找資源,這種情況都是出現在高密度,以及低密度的手機上,比如說一部240×320畫素的手機, 
如果設定android:anyDensity="false",Android系統會將240 x 320(低密度)轉換為 320×480(中密度),這樣的話,應用就會在小密度手機上載入mdpi檔案中的資源。 
3.2是否支援大螢幕 
android:largeScreens=["true" | "false"] 
如果在宣告不支援的大螢幕,而這個螢幕尺寸是larger的話,系統使用尺寸為("normal")和密度為("medium)顯示, 
不過會出現一層黑色的背景。 
3.3是否支援小螢幕 
android:smallScreens=["true" | "false"] 
如果在宣告不支援的小螢幕,而當前螢幕尺寸是smaller的話,系統也使用尺寸為("normal")和密度為("medium)顯示 
如果應用程式能在小螢幕上正確縮放(最低是small尺寸或最小寬度320dp),那就不需要用到本屬性。否則,就應該為最小螢幕寬度識別符號設定本屬性 
來匹配應用程式所需的最小尺寸。 


4、Android提供3種方式處理螢幕自適應
 
4.1預縮放的資源(基於尺寸和密度去尋找圖片) 
1)如果找到相應的尺寸和密度,則利用這些圖片進行無縮放顯示。 
2)如果沒法找到相應的尺寸,而找到密度,則認為該圖片尺寸為 "medium",利用縮放顯示這個圖片。 
3)如果都無法匹配,則使用預設圖片進行縮放顯示。預設圖片預設標配 "medium" (160)。 
4.2自動縮放的畫素尺寸和座標(密度相容) 
1)如果應用程式不支援不同密度android:anyDensity="false",系統自動縮放圖片尺寸和這個圖片的座標。 
2)對於預縮放的資源,當android:anyDensity="false",也不生效。 
3)android:anyDensity="false",只對密度相容起作用,尺寸相容沒效果 
4.3相容更大的螢幕和尺寸(尺寸相容) 
1)對於你在宣告不支援的大螢幕,而這個螢幕尺寸是normal的話,系統使用尺寸為 ("normal")和密度為("medium)顯示。 
2.)對於你在宣告不支援的大螢幕,而這個螢幕尺寸是larger的話,系統同樣使用尺寸為("normal")和密度為("medium)顯示, 
不過會出現一層黑色的背景。 

5、Android系統自動適配技巧 
Android系統採用下面兩種方法來實現應用的自動適配: 
1)佈局檔案中定義長度的時候,最好使用wrap_content,fill_parent, 或者dp 進行描述,這樣可以保證在螢幕上面展示的時候有合適的大小 
2)為不同螢幕密度的手機,提供不同的點陣圖資源,可以使得介面清晰無縮放。 
對應bitmap 資源來說,自動的縮放有時會造成放大縮小後的影象變得模糊不清,這是就需要應用為不同螢幕密度配置提供不同的資源:為高密度的螢幕提供高清晰度的影象等。 
3)不要使用AbsoluteLayout 
4)畫素單位都使用DIP,文字單位使用SP 

6、在程式碼中獲取螢幕畫素、螢幕密度 
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) 

7、 一般多解析度處理方法及其缺點 
7.1 圖片縮放 
基於當前螢幕的精度,平臺自動載入任何未經縮放的限定尺寸和精度的圖片。如果圖片不匹配,平臺會載入預設資源並且在放大或者縮小之後可以滿足當前介面的顯示要求。例如,當前為高精度螢幕,平臺會載入高精度資源(如HelloAndroid中drawable-hdpi 中的點陣圖資源),如果沒有,平臺會將中精度資源縮放至高精度,導致圖片顯示不清晰。 
7.2 自動定義畫素尺寸和位置 
如果程式不支援多種精度螢幕,平臺會自動定義畫素絕對位置和尺寸值等,這樣就能保證元素能和精度160 的螢幕上一樣能顯示出同樣尺寸的效果。例如,要讓WVGA 高精度螢幕和傳統的HVGA 螢幕一樣顯示同樣尺寸的圖片,當程式不支援時,系統會對程式慌稱螢幕解析度為320×480,在(10,10)到(100,100)的區域內繪製圖形完成之後,系統會將圖形放大到(15,15)到(150,150)的螢幕顯示區域。 
7.3 相容更大尺寸的螢幕 
當前螢幕超過程式所支援螢幕的上限時,定義supportsscreens元素,這樣超出顯示的基準線時,平臺在此顯示黑色的背景圖。例如,WVGA 中精度螢幕上,如程式不支援這樣的大螢幕,系統會謊稱是一個320×480 的,多餘的顯示區域會被填充成黑色。 
7.4 採用OpenGL 動態繪製圖片 
Android 底層提供了OpenGL 的介面和方法,可以動態繪製圖片,但是這種方式對不熟悉計算機圖形學的開發者來講是一個很大的挑戰。一般開發遊戲,採用OpenGL 方式。 
7.5 多個apk 檔案 
Symbian 和傳統的J2ME 就是採用這種方式,為一款應用提供多個解析度版本,使用者根據自己的需求下載安裝相應的可執行檔案。針對每一種螢幕單獨開發應用程式不失為一種好方法,但是目前Google Market 對一個應用程式多個解析度版本的支援還不完善,開發者還是需要儘可能使用一個apk 檔案適應多個解析度。 

作者:流星 
出處:http://blog.sina.com.cn/staratsky