官方地址:http://developer.android.com/guide/practices/screens_support.html
一、關於布局適配建議
二、術語和概念
四種屏幕尺寸分類:: small, normal, large, and xlarge
四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
需要注意的是: xhdpi是從 Android 2.2 (API Level 8)才開始增加的分類.
xlarge是從Android 2.3 (API Level 9)才開始增加的分類.
DPI是“dot per inch”的縮寫,每英寸像素數。
一般情況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
三、如何做到自適應屏幕大小呢?
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,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi
Android有個自動匹配機制去選擇對應的布局和圖片資源
四、兩種獲取屏幕分辨率信息的方法:
DisplayMetrics metrics = new DisplayMetrics(); Display display = activity.getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); //這里得到的像素值是設備獨立像素dp
//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 這樣獲得的參數信息不正確,不要使用這種方式。 不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。這個得到的寬和高是空的。
五、關於圖片制作
屏幕級別
|
屏幕密度
|
比率(相對)
|
物理大小(英寸)
|
像素大小
|
通常的分辨率
|
|
ldpi
|
120
|
3
|
0.75
|
1
|
120
|
|
mdpi
|
160
|
4
|
1
|
1
|
160
|
320*480
|
hdpi
|
240
|
6
|
1.5
|
1
|
240
|
480*800
|
xhdpi
|
320
|
8
|
2
|
1
|
320
|
720*1280
|
xxhdpi
|
480
|
12
|
3
|
1
|
480
|
1080*1800
|
DPI是“dot per inch”的縮寫,每英寸像素數。 一般情況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。 參考:http://developer.android.com/images/screens_support/screens-ranges.png
附加:配置限定符名稱
配置 | 限定符值 | 說明 |
MCC和MNC | 例如: mcc310 mcc310-mnc004 mcc208-mnc00 等 | MCC是移動國家代碼的英文首字母縮寫(The mobile country code),它的后面可選擇性的跟隨來自設備內的SIM卡的移動網絡代碼(MNC:mobile network code)。如在任何載體上,mcc310代表美國,mcc310-mnc004代表美國的Venizon公司,mcc208-mnc00代表法國的Orange公司。 如果設備使用音頻連接(GSM 電話),那么MCC和MNC的值來自SIM卡。 也可以單獨使用MCC(例如,在應用程序中包含特殊國家合法的資源)。如果僅需要指定語言環境,那么可以使用language和region限定符來替代(稍后討論)。如果決定要使用MCC和MNC限定符,就要仔細測試,使它能夠滿足你所期望的工作。 還可以查看配置域mcc和mnc,它們分別指示了當前的移動國家代碼和移動網絡代碼。 mcc:http://developer.android.com/reference/android/content/res/Configuration.html#mcc mnc:http://developer.android.com/reference/android/content/res/Configuration.html#mnc |
語言和地區 | 例如: en fr en-rUS fr-rFR fr-rCA | 語言是用兩個字母的ISO 639-1語言代碼定義的,緊跟其后的是可選的兩個ISO-3166-1-appha-2地區代碼字母(前面是小寫的“r”)。 這個編碼不區分大小寫,r前綴被用於區分地區部分,不能夠單獨指定地區。 如果用戶改變了系統中的語言設置,那么在應用程序的運行期間也能夠改變為對應的語言。 |
最小寬度 | sw<N>dp 例如: sw320dp sw600dp sw720dp 等 | 屏幕的基本尺寸,是指最短的可用屏幕區域。具體的說,設備的最小寬度是屏幕可用的寬度和高度中最短的那個(也可以把它看做是屏幕的最小可能的寬度)。這樣就可以使用這個限定符來確保應用程序至少有<N>dp的寬度可用於UI界面,而不管屏幕的當前方向。 例如,如果布局在任何時候都需要至少600dp的最小屏幕尺寸,那么就能夠使用這個限定符,在res/layout-sw600dp/目錄中創建布局資源。系統只會在可用屏幕的尺寸至少是600dp的時候才會使用這些資源,而不管600dp是否是被用戶認知的高度或寬度。最小寬度是設備的固定屏幕尺寸特征,當屏幕的方向發生改變時,設備的最小寬度不改變。 設備的最小寬度需要考慮屏幕的裝飾和系統UI的占用。例如,如果設備有一些固定的UI元素要沿着最小寬度的軸向,占用一定的屏幕空間,那么系統聲明的最小寬度要比實際的屏幕尺寸要小,因為被系統占用的像素部分對用戶應用程序的UI無效。因此,這個值應該是應用程序布局所需要的最小的實際尺寸(通常,這個值是布局支持的最小寬度,而不管屏幕的當前方向)。 以下是可以使用的通用屏幕尺寸的一些值: 1.320,針對以下屏幕配置的設備: 240x320ldpi(QVGA手持設備) 320x480mdpi(手持設備) 480x800hdpi(高分辨率手持設備) 2.480,針對480x800mdpi的屏幕(平板或手持設備) 3.600,針對600x1024mdip的屏幕(7英寸平板) 4.720,針對720x1280mdip的屏幕(10英寸平板) 當應用程序提供了多個帶有不同值的最小寬度限定符資源目錄時,系統會使用最接近(不超出)設備最小寬度的那個資源。 這個限定符被添加在API級別13中。 還要看android:requiresSmallestWidthDp屬性,它聲明了與你的應用程序兼容的最小的最小寬度,並且smallestScreenWidthDp配置字段會持有這個設備最小寬度的值。 |
可用寬度 | w<N>dp 例如: w720dp w1024dp 等 | 指定最小的可用屏幕寬度,在資源中應該以dp為單位來定義<N>的值。當方向在橫向和縱向之間改變時,這個配置值會跟當前的實際的寬度相匹配。 當應用程序給這個配置提供了多個不同值的資源目錄時,系統會使用最接近(不超過)設備當前屏幕寬度的那個配置。這個值需要考慮屏幕裝飾占據的空間,因此,如果設備在顯示的左邊或右邊有一些固定的UI元素,那么使用的寬度值就要比實際的屏幕尺寸小,因為這些固定UI元素的占用,使得應用程序的可用空間減少。 這個特性被添加在API級別13中 還要看screenWidthDp配置字段,它持有當前的屏幕寬度。 |
可用高度 | h<N>dp 例如: h720dp h1024dp 等 | 指定最小的可用屏幕高度,在資源中應該以dp為單位來定義<N>的值,當方向在橫向和縱向直接改變時,這個配置值應該跟當前的實際高度匹配。 當應用程序給這個配置提供了不同值的多個資源目錄時,系統會使用最接近(不超過)設備當前屏幕高度的那個配置。這個要考慮屏幕裝飾的占用情況,因此,如果設備在顯示的上方或底部有一些固定的UI元素,那么要使用的高度值要比實際的屏幕尺寸小,因為這些固定UI元素的占用,使得應用程序的可用空間減少。不固定的屏幕裝飾(如電話的狀態欄能夠在全屏時被隱藏)是不考慮的,像標題欄或操作欄這樣的窗口裝飾也不考慮,因此應用必須准備處理比它們指定的空間要小的情況。 這個限定符被添加在API級別13中。 還要看screenHeightDp配置字段,它持有當前屏幕的高度。 |
屏幕尺寸 | small normal large xlarge | small:這種屏類似低分辨率的QVGA屏幕。對於小屏的最小布局尺寸大約是320x426dp。例如QVGA低分辨率和VGA高分辨率。 normal:這種屏類似中等分辨率的HVGA屏幕。對於普通屏幕的最小布局尺寸大約是320x470dp。如,WQVGA低分辨率屏、HVGA中等分辨率屏、WVGA高分辨率屏。 large:這種屏類似中等分辨率的VGA屏幕,對於大屏幕的最小布局尺寸大約是480x640dp。例如VGA和WVGA的中等分辨率屏。 xlarge:這種屏被認為比傳統的中等分辨率的HVGA屏幕大。針對xlarge屏的最小布局尺寸大約是720x960dp。在大多數情況下,這種超大屏幕的設備因為太大而要放到背包中來攜帶,而且最有可能的是平板樣式的設備。 注意:使用尺寸限定符不意味着資源僅用於這個尺寸的屏幕。如果沒有用限定符提供與當前設備配置相匹配的可選資源,那么系統會使用與配置最接近的資源。 警告:如果所有使用尺寸限定符的資源都比當前屏幕大,那么系統將不會使用它們,並且應用程序會在運行時崩潰(例如,如果所有的布局都被標記了xlarge限定符,而設備卻是一個普通尺寸的屏幕)。 這個限定符被添加在API級別4以后的版本中。 |
屏幕外觀 | long notlong | long:長屏幕,如WQVGA、WVGA、FWVGA notlong:非長屏幕,如QVGA、HVGA、VGA 這個限定符被添加在API級別4以后的版本中 這個限定符完全是基於屏幕的外觀比率,不相對屏幕的方向。 還要看screenLayout配置字段,它指示了屏幕是否是長屏。 |
屏幕方向 | port land | port:縱向設備(垂直) land:橫向設備(水平) 如果用戶旋轉屏幕,這個限定能夠在應用程序運行期間改變。 orientation配置字段指示當前設備的方向。 |
泊位模式 | car desk | car:設備停靠在汽車中 desk:設備停靠在書桌中 這個限定符被添加在API級別8以后的版本中 如果用戶改變了設備的停靠地點,那么能夠在應用程序的運行期間改變這個限定。可以使用UiModeManager對象來啟用或禁止這種模式。 |
夜間模式 | night notnight | night:夜間 notnight:白天 被添加在API級別8以后的版本中 如果夜間模式被保留在自動模式中(默認),那么在應用程序運行期間,會基於白天的時間來進行模式的改變。可以使用UiModeManager對象來啟用或禁止這種模式。 |
屏幕像素密度(dpi) | ldpi mdpi hdpi xhdpi nodpi tvdpi | ldpi:針對大約120dpi的低分辨率屏幕; mdpi:針對大約160dpi的中等分辨率屏幕(在傳統的HVGA上); hdpi:針對大約240dpi的高分辨率屏幕; xhdpi:針對大約320dpi的超高分辨率屏幕,被添加在API基本8以后的版本中; nodpi:這個限定被用於不想根據匹配的設備分辨率進行縮放的位圖資源。 tvdpi:在mdpi和hdpi之間的屏幕,大約是213dpi。這種分組不是主要的分辨率,大多數是為電視來考慮的,並且大多數應用不需要它---提供mdpi和hdpi資源就可以滿足大多數應用程序需要了,並且系統會適當的縮放它們。這個限定符在API級別13以后被引入。 四種主要的分辨率之間的縮放比例是:3:4:6:8(忽略tvdpi分辨率),因此一個9x9的ldpi位圖,在mdpi中是12x12、在hdpi中是18x18、在xhdpi中是24x24。 如果感覺在電視或其他某些設備上的圖片資源不好看,並且想要試用tvdpi資源,那么縮放因子是1.33*mdpi。例如,一個100px x 100px的mdpi圖片的圖片應該被放大成133px x 133px的tvdpi圖片。 注意:使用分辨率限定符不意味着資源僅適用與對應分辨率的屏幕。如果沒有提供與當前設備配置匹配的可選資源,那么系統會使用最接近的資源。 |
觸屏類型 | notouch stylus finger | notouch:非觸屏設備 stylus:有適用手寫筆的電阻屏設備 finger:觸屏設備 touchscreen配置字段,指示到了設備上的觸屏類型。 |
鍵盤可用性 | keysexposed keyshidden keyssoft | keysexposed:設備有可用的鍵盤。如果設備啟用了軟鍵盤,那么即使在硬鍵盤沒有暴露給用戶時也可以使用這個限定符。如果沒有提供軟鍵盤或者軟鍵盤被禁用,那么只有在硬鍵盤被暴露給用戶時才能夠使用這個限定符。 keyshidden:設備有可用的硬鍵盤,但是被隱藏了,並且設備沒有可用的軟鍵盤。 keyssoft:設備有可用的軟鍵盤,不管它是否可見。 如果提供了keysexposed資源,但沒有keyssoft資源,那么只要系統有可用的軟鍵盤,系統就會使用keysexposed資源而不管鍵盤是否可見。 如果用戶打開了硬鍵盤,就可以在應用程序運行期間改變這個限定。 hardKeyboardHidden和keyboardHidden配置字段分別指明硬鍵盤的可見性以及可見的鍵盤類型(包括軟鍵盤)。 |
主要文本輸入法 | nokeys qwerty l2key | nokeys:設備沒有用於文本輸入的硬鍵盤; qwerty:設備有標准的硬鍵盤,不管用戶是否可見; 12key:設備有12個鍵的硬鍵盤,不管用戶是否可見。 keyboard配置字段指明可用的主要文本輸入方法。 |
導航鍵的有效性 | navexposed navhidden | navexposed:導航鍵對用戶可用; navhidden:導航鍵不可用。 如果用戶能夠看到導航鍵,那么在應用程序運行時就能夠改變這個限定。 navigationHidden配置字段,指示導航鍵是否隱藏。 |
主要的非觸屏導航方法 | nonav dpad trackball wheel | nonav:除了使用觸屏以外,設備沒有其他導航設施。 dpad:設備有用於導航的定向板(d-pad)。 trackball:設備有用於導航的軌跡球。 wheel:設備有用於導航的定向滾輪(不常見)。 navigation配置字段指明可用的導航方法類型。 |
平台版本(API 級別) | 例如: v3 v4 v7 等 | 設備支持的API級別。如v1代表API級別1(帶有Android1.0或更高版的設備),v4代表API級別4(帶有Android1.6或更高版本的設備) 警告:Android1.5和1.6只有在限定符跟平台版本完全匹配時,才能匹配資源 |