android屏幕適配詳解

android屏幕適配詳解html

官方地址:http://developer.android.com/guide/practices/screens_support.htmlandroid

 

1、關於佈局適配建議網絡

一、不要使用絕對佈局
二、儘可能使用match_parent 而不是fill_parent 。
三、可以使用權重的地方儘可能使用權重(android:layout_weight)
四、若是是純色背景,儘可能使用android的shape 自定義。
五、若是須要在特定分辨率下適配,能夠在res目錄上新建layout-HxW.xml的文件夾。好比要適配1080*1800的屏幕(魅族MX3採用此分辨率)則新建layout-1800x1080.xml的文件夾,而後在下面定義佈局。Android系統會優先查找分辨率相同的佈局,若是不存在則換使用默認的layout下的佈局。
 

2、術語和概念app

四種屏幕尺寸分類:: small, normal, large, and xlargeide

四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)工具

須要注意的是: xhdpi是從 Android 2.2 (API Level 8)纔開始增長的分類.佈局

xlarge是從Android 2.3 (API Level 9)纔開始增長的分類.post

DPI是「dot per inch」的縮寫,每英寸像素數。測試

通常狀況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。ui

 

3、如何作到自適應屏幕大小呢?

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有個自動匹配機制去選擇對應的佈局和圖片資源

 

4、兩種獲取屏幕分辨率信息的方法:

DisplayMetrics metrics = new DisplayMetrics(); Display display = activity.getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); //這裏獲得的像素值是設備獨立像素dp

//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 這樣得到的參數信息不正確,不要使用這種方式。 不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。這個獲得的寬和高是空的。

 

5、關於圖片製做

1)關於設計:
設計圖先定下一個要設計的尺寸,並且儘可能採用在目前最流行的屏幕尺寸(好比目前佔屏幕比重比較多的是480系列,也便是480*800或者400*854,下面的圖標製做也在次基礎上進行比例的換算)上設計。
先了解一下屏幕的級別:
屏幕級別
屏幕密度
比率(相對)
物理大小(英寸)
像素大小
一般的分辨率
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
說明:
屏幕級別:
注意屏幕級別是按照密度分級,和像素沒有關係。若是非要讓密度和像素扯上關係,則須要一個參照系,android使用mdpi級別做爲標準參照屏幕,也就是說在320*480分辨率的手機上一個密度能夠容納一個像素。而後其餘密度級別則在此基礎上進行對比。若是理想狀況下,480*800的屏幕一個密度能夠容納1.5個像素。
物理大小:
單位是英寸而不是像素,也就說一個英寸在任何分辨率下顯示的大小都是同樣的,可是像素在密度不一樣的手機裏面顯示的實際的大小是不同的(這就是爲何android手機須要適配的緣由)。
而後就是重點。
假設1像素在160密度下顯示1英寸,則1像素在240密度基礎上顯示大約0.67英寸,在320密度下顯示0.5英寸。因而就出現一種狀況,在電腦上的一個像素,在不一樣的手機上看實際的大小不同。那麼怎麼讓「設計效果」在不一樣的手機上看起來顯示的區域同樣呢?
仍是假設一個像素在160密度下的顯示在一個密度內,也假設就是一英寸。那麼須要幾個像素才能在240密度級別下顯示在一英寸範圍內呢?答案是1.5個像素(根據上圖的比率換算)。
瞭解了這個關係,接下來就是圖標的製做。
2)關於切圖。
關於切圖有幾個建議:
第一,長寬最好是3的倍數(根據android的推薦logo圖標的大小是48(mdpi),72(hdpi),96(xhdpi)得出的最小公約數)。
第二,長寬最好是偶數。由於奇數在進行等比壓縮的時候可能有問題。
第三,根據上面兩條,若是長寬是6的倍數最理想。
第四,若是能夠拉伸而不改變設計意圖的狀況下,好比純色背景,則使用android的9path工具製做成.9的圖片。
3)關於圖標的適配。
而後接下來的一切就和設計稿沒什麼關係。在切好圖的基礎上,根據屏幕密度、像素和實際大小的比例關係。假如設計司在480*800的分辨率下作好了設計圖,而且切好圖,若是你須要適配720*1280屏幕,該怎麼作?根據比例,他們的關係是2:3,因而你須要按照1.5倍比例製做圖標,好比你在480*800的設計稿上切下來一個20*20像素的圖,那麼你就須要製做一個等比放大成30*30像素的圖標,這樣同一個圖標在480*800的屏幕和720*1280的屏幕上顯示的實際大小才同樣。同理,若是你須要適配xxhdpi則須要在20*20的基礎上製做一個等比放大成40*40像素的圖標。
4)關於圖標的目錄,480*800切下來的圖咱們放在drawable-hdpi目錄下,按照2:3放大的圖標放在drawable-xhdpi目錄下,按照2倍放大的圖標放在drawable-xxhdpi目錄下。
android會根據手機的密度優先查找對應的目錄的資源,
好比408*800分辨率下的手機若是密度是160,則自動加載drawable-hdpi這個目錄下的圖標,
若是720*1280密度是240的手機自動加載drawable-xhdpi這個目錄下的圖標。若是沒有這個文件夾,則查找和240最接近的對應密度文件夾。
5)其它
接下來要說的估計會讓你失望,根據上面的步驟也不能徹底解決適配的問題,只能是大概適配,而就算根據上面的步驟大概適配了,實際在手機上的效果也有出入。
好比魅族MX3的分辨率是1080*1800,標準狀況下密度是480,可是他的密度大約是524,和480接近,也就是會查找drawable-xxhdpi這個資源下的文件。也就是說你在480*800分辨率下切圖而後按兩倍放大的圖標在這臺手機上顯示的效果仍是比實際的小。
而另外一個要說的問題是540*960或者640*960,他們的密度極可能是或者接近240也多是320。因而在480*800的設計稿上切下來的圖而且進行的適配製做,在這些手機上顯示的實際大小也可能或大或小。
綜上所述,我也只是把個人理解和經驗分享一下,可是並不能完美適配屏幕,僅僅當作拋磚引玉,若是您路過而且看到這份建議,若是你正好有更好的方案可以進行適配,請不吝賜教。
 
在代碼中獲取屏幕像素、屏幕密度  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) 
 

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中是12x十二、在hdpi中是18x1八、在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只有在限定符跟平臺版本徹底匹配時,才能匹配資源
 
相關文章
相關標籤/搜索