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

(1)drawable-hdpi裏面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)

  (2)drawable-mdpi裏面存放中等分辨率的圖片,如HVGA (320x480)

  (3)drawable-ldpi裏面存放低分辨率的圖片,如QVGA (240x320)


ldpi:240x320
mdpi:320x480
hdpi:480x800、480x854
xhdpi:至少960*720
xxhdpi:1280×720

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