Android進階練習-匹配多種螢幕這幾天學習了Android下應用程式對不同螢幕密度適應的問題,其中涉及到圖片資源,布局資源,使用固定尺寸,資源的尋找規則等問題
螢幕概念明確手機螢幕的尺寸、密度、解析度等幾個概念
1, Screen size 螢幕的尺寸,即對角線長度(單位inch-英寸)
2, Screen density螢幕密度,即單位長度像素點數(pots/inches)
3, Resolution 解析度,即螢幕的總像素點數(width * height)
4, Density-independent pixel (dp)獨立像素密度。標準是160dip.即1dp對應1個pixel,計算公式如:px = dp * (dpi / 160),螢幕密度越大,1dp對應的像素點越多,相應的螢幕顯示的也更清晰
螢幕的分類
可以根據公式px = dp * (dpi / 160)算出螢幕的高和寬dp表示應用對應的資來源目錄為xhdpi,hdpi,mdpi,ldpi兩個手機螢幕解析度可能相同,但密度有可能差了一個層級,對應的資來源目錄也就不同了,這點要注意一下比如提供給我們的模擬器當中5.1"WVAG(480*800:mdpi)和Nexus One(3.7",480*800:hdpi),前者的密度是160,後者的密度為240,但它們的解析度是一樣的
圖片資源的匹配drawable-ldpi 為small密度時,該圖片即適用於橫屏,也適用於豎屏drawable-land-ldpi 當螢幕為橫屏,且為small密度時,載入此檔案夾中的資源drawable-port-ldpi 當螢幕為豎屏,且為small密度時,載入此檔案夾中的資源
drawable-mdpi 為normal密度時,該圖片即適用於橫屏,也適用於豎屏drawable-land-mdpi 當螢幕為橫屏,且為normal密度時,載入此檔案夾中的資源drawable-port-mdpi 當螢幕為豎屏,且為normal密度時,載入此檔案夾中的資源
drawable-hdpi 為large密度時,該圖片即適用於橫屏,也適用於豎屏drawable-land-hdpi 當螢幕為橫屏,且為large密度時,載入此檔案夾中的資源drawable-port-hdpi 當螢幕為豎屏,且為large密度時,載入此檔案夾中的資源drawable-hdpi 為xlarge密度時,該圖片即適用於橫屏,也適用於豎屏drawable-land-hdpi 當螢幕為橫屏,且為xlarge密度時,載入此檔案夾中的資源drawable-port-hdpi 當螢幕為豎屏,且為xlarge密度時,載入此檔案夾中的資源需要注意的是當橫豎屏切換時,系統會去自動載入對應的資來源目錄中圖片
固定尺寸的適配有些時候我們避免不了要使用一些固定的尺寸,雖然並不建議這樣做,這時我們該怎麼做呢查看google提供的範例應用中發現,原來可以在不同的values目錄下,建立dimens.xml檔案來進行匹配
<resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen > <dimen name="activity_vertical_margin">16dp</dimen ></resources>
在layout中使用 @dimens/
activity_horizontal_margin 進行引用values資來源目錄和drawable資來源目錄用類似的目錄結構來進行螢幕的匹配適應,但由於Android作業系統3.0版本是特定於給PAD使用,PAD上使用values-v11目錄來匹配3.0版PADvalues資來源目錄還可以像這樣指定values-sw600dp,意思是說螢幕的最短邊要達到600dp才能夠進行匹配,但不知道優先順序咋樣,知道的朋友望告訴一下=.=其實values目錄還有許多其它的作用,可以在不同的解析度下指定樣式,布局layout檔案、drawable圖片、bool值等可以下載範例程式:http://www.android-doc.com/training/multiscreen/index.html 來參考
布局資源layout的適配
根據不同的螢幕大小介面可能會不一樣,layout資源的匹配和尺寸、圖片的匹配大同小異系統都是根據當前螢幕解析度特徵尋找對應目錄下的資源,layout_hdpi、layout_mdpi、layout、layout_ldpi
資源的尋找規則
如果有個別資來源目錄不存在需要引用的資源,那麼Android系統會去'相近'資來源目錄中尋找,以layout為例
如果一個大屏手機適配的話,適配的順序是layout_hdpi->layout_mdpi->layout->layout_ldpi;
如果一個中屏手機適配的話,適配的順序是layout_mdpi->layout->layout_hdpi->layout_ldpi;
如果一個小屏手機適配的話,適配的順序是layout_ldpi->layout->layout_mdpi->layout_hdpi;
Android尋找最佳資源原理
1, 排除與裝置設定不符合的資源
2, 根據限定詞(qualifier)的優先順序,按照順序尋找
3, 在限定詞下,是否存在資源路徑
4, 排除不包含在限定詞中的資源路徑
5, 繼續執行不同的限定詞尋找,直到找到相應的資源根據這種規則,當我們只為應用準備一套資源時,應該放在layout_mdpi目錄中,而不是建立layout目錄來存放,其它類型資源同理最後別忘了在manifestxml進行如下定義,意思是讓應用支援相應的解析度
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" />
參考文章
http://ericbaner.iteye.com/blog/1703217
http://blog.sina.com.cn/s/blog_74c22b210100tn3o.html http://mikewang.blog.51cto.com/3826268/865304http://www.cnblogs.com/xiongbo/archive/2011/09/27/2192964.html