編輯:關於Android編程
一、屏幕適配的必要性
為什麼Android需要適配?
由於Android系統的開放性,任何用戶、開發者、OEM廠商、運營商都可以對Android進行定制,修改成他們想要的樣子。
但是這種“碎片化”到底到達什麼程度呢?
在2012年,OpenSignalMaps(以下簡稱OSM)發布了第一份Android碎片化報告,統計數據表明,
2012年,支持Android的設備共有3997種。
2013年,支持Android的設備共有11868種。
2014年,支持Android的設備共有18796種。
隨著Android系統的設備(手機、平板、電腦、手表)的增多,設備碎片化、品牌碎片化、系統碎片化、傳感器碎片化和屏幕碎片化的程度也在不斷地加深。Android設備的屏幕尺寸,從幾寸的智能手機,到10寸的平板電腦,再到幾十寸的數字電視,我們應該適配哪些設備?對於具有相同像素密度的設備來說,相像素越高,尺寸越大,從單純的尺寸大小轉換到像素大小和像素密度的角度來。
而對我們開發而言影響比較大的——屏幕碎片化
二、屏幕適配你所需要知道的
1,什麼是屏幕尺寸?
屏幕尺寸:實際的物理尺寸,指屏幕的對角線的長度(單位inch-英寸)。
1英寸=2.54厘米。常見屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等。
四種屏幕尺寸分類:小(small),正常(normal),大(large),超大(xlarge)。
2,什麼是屏幕分辨率?
屏幕分辨率:分為“圖像分辨率”與“物理顯示分辨率”;它們都是水平像素點數與垂直像素點數的乘積,也就是像素總和數。圖像分辨率是指圖片文件記錄著自身所有的像素數。物理顯示分辨率是指物理顯示屏水平與垂直能顯示的像素數的乘積。
指在橫縱向上的像素點數,單位是px,1px=1個像素點。一般以縱向像素*橫向像素,如1960*1080。
3,什麼是屏幕像素密度dpi?屏幕密度的劃分?
屏幕像素密度:指每英寸上的像素點數,點位dpi。
屏幕像素密度與屏幕尺寸和屏幕分辨率有關。在單一變化條件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
標准是160dpi.即1dp=1個px,計算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp對應的像素點越多。
不同設備有不同的顯示效果,這個和設備硬件有關一般我們為了支持WVGA、HVGA和QVGA推薦使用這這個不依賴像素。
我們可以根據長或者根據寬來計算出dpi,計算公式為:
dpi=寬/((尺寸^2 * 寬^2)/(寬^2 + 高^2))^(1/2)
= 長/((尺寸^2 * 長^2)/(寬^2 + 高^2))^(1/2)
為簡單起見,Android中的所有實際的屏幕密度分為六個廣義密度:
低(ldpi),中(mdpi),高(hdpi),超高(xhdpi),超超高(xxhdpi),超超超高(xxxhdpi)。
屏幕像素密度越大圖片顯示就越清晰。
4,什麼是屏幕方向?
從用戶的角度看到的屏幕方向。一般為橫向或縱向,即屏幕的寬高比。注意,不僅要關注不同的設備在缺省情況下的屏幕方向。同一設備當用戶旋轉時,應用程序的屏幕方向也需要關注。
5,Android系統的長度單位:
px(像素)——終端上的一個物理像素點,例如,480*800的屏幕在橫向有320個象素,在縱向有480個象素。
像素注解:
一幅圖片的顯示就是由許多顯示著不同顏色的小方格組成的,這樣的小方格就被稱為像素,是構成圖片的最小單位。像素的具體大小取決於顯示這張圖片的具體的物理設備顯示一個圖片像素點的熒光點的大小.圖片文件只是記錄著它自身有多少個像素點,每個像素點顯示什麼顏色,至於它自身物理尺寸有多大,它自身也無法得知。
例如一張480*800像素的圖片在電腦顯示器上顯示明顯要比在手機屏幕上顯示大很多,而這張圖片本身並沒有改變.只是手機的屏比電腦顯示器的屏要精細許多,也就是每一個物理像素點要小許多,密度也就大許多.
dip(dp)——這是Android開發中特有的一種度量,稱作屏幕無關像素, 它不表示任何具體的長度或者像素點,是一種基於屏幕密度抽象單位,被稱作“設備獨立像素”,會隨著屏幕的密度進行自動的大小調整.
dp和px如何換算呢?在Android中,規定以160dpi為基准,1dip=1px,如果密度是320dpi, 則1dip=2px,以此類推。
sp——比例像素,與dp類似,可以根據文字大小首選項進行放縮,主要處理字體大小。
in:英寸,標准長度單位
mm:毫米,標准長度單位
pt:磅,標准長度單位,1/72英寸
dp和px轉換公式:px = dp * (dpi / 160)
英寸和厘米之間的轉換公式:1英寸=2.54厘米
下圖是2014年初,友盟統計的占比5%以上的6個主流分辨率,可以看出,占比最高的是480*800,320*480的設備竟然也占據了很大比例,但是和半年前的數據相比較,中低分辨率(320*480、480*800)的比例在減少,而中高分辨率的比例則在不斷地增加。雖然每個分辨率所占的比例在變化,但是總的趨勢沒變,還是這六種,只是分辨率在不斷地提高。
所以說,我們只要盡量適配這幾種分辨率,就可以在大部分的手機上正常運行了。
這幾種分辨率分別是:1280x720、1920x1080、854x480、800x480、960x540、480x320
不過一般情況下,我們適配兩三套就可以了,除非遇到特殊情況的手機,就根據特殊情況來適配。
三、配置限定符
配置限定符的名稱:
幾乎每個應用程序應該提供替代的資源,以支持特定的設備配置。
1,創建一個新目錄,在res/命名的形式
您可以附加多個
謹慎:當追加多個限定符,你必須將它們放置在如下表 2 中列出的順序相同。如果限定符是有錯序,資源將被忽略。
表2:
附加:配置限定符名稱
配置
限定符值
說明
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.htmlmnc:http://developer.android.com/reference/android/content/res/Configuration.html
語言和地區
例如: en fr en-rUS fr-rFR fr-rCA
語言是用兩個字母的ISO 639-1語言代碼定義的,緊跟其後的是可選的兩個ISO-3166-1-appha-2地區代碼字母(前面是小寫的“r”)。 這個編碼不區分大小寫,r前綴被用於區分地區部分,不能夠單獨指定地區。 如果用戶改變了系統中的語言設置,那麼在應用程序的運行期間也能夠改變為對應的語言。
最小寬度
swdp 例如: sw320dp sw600dp sw720dp 等
屏幕的基本尺寸,是指最短的可用屏幕區域。具體的說,設備的最小寬度是屏幕可用的寬度和高度中最短的那個(也可以把它看做是屏幕的最小可能的寬度)。這樣就可以使用這個限定符來確保應用程序至少有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配置字段會持有這個設備最小寬度的值。
可用寬度
wdp 例如: w720dp w1024dp 等
指定最小的可用屏幕寬度,在資源中應該以dp為單位來定義的值。當方向在橫向和縱向之間改變時,這個配置值會跟當前的實際的寬度相匹配。 當應用程序給這個配置提供了多個不同值的資源目錄時,系統會使用最接近(不超過)設備當前屏幕寬度的那個配置。這個值需要考慮屏幕裝飾占據的空間,因此,如果設備在顯示的左邊或右邊有一些固定的UI元素,那麼使用的寬度值就要比實際的屏幕尺寸小,因為這些固定UI元素的占用,使得應用程序的可用空間減少。 這個特性被添加在API級別13中 還要看screenWidthDp配置字段,它持有當前的屏幕寬度。
可用高度
hdp 例如: h720dp h1024dp 等
指定最小的可用屏幕高度,在資源中應該以dp為單位來定義的值,當方向在橫向和縱向直接改變時,這個配置值應該跟當前的實際高度匹配。 當應用程序給這個配置提供了不同值的多個資源目錄時,系統會使用最接近(不超過)設備當前屏幕高度的那個配置。這個要考慮屏幕裝飾的占用情況,因此,如果設備在顯示的上方或底部有一些固定的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只有在限定符跟平台版本完全匹配時,才能匹配資源
以上所寫的限定符只是簡單介紹,主要是為了得知限定符的順序,要看完整列表,請到官網限定符url:http://developer.android.com/guide/topics/resources/providing-resources.html
2,在這新的目錄中保存各自的替代資源。資源文件必須命名的默認資源文件完全相同。
Android 支持幾個配置限定符,你可以將多個限定符添加到一個目錄名稱,通過用短劃線分隔每個限定符。按優先級順序 — — 如果你使用多個限定符資源目錄,你必須將他們添加到表中列出的順序中的目錄名稱。
3,配置限定符的名稱列表,
(1)配置:MCC和跨國公司
限定符值:如mcc310(是美國在任何載體上)、mcc310-mnc004(是美國Verizon)、mcc208-mnc00(是法國上橙色)等;
(2)配置:語言和區域
限定符值:如en、fr、rn-rUS、fr-rFR、fr-rCA等;
(3)配置:布局方向:你的應用程序布局方向
限定符值:
ldrtl“布局-方向-右到左”如文件名:res/layout/layout-ldrtl/
ldltr“布局-方向-左到右”如文件名:res/layout/layout-ldltr/
注:若要為您的應用程序啟用從右向左布局功能,必須將supportsRtl設置為"true",並將targetSdkVersion設置為17或更高。
(4)配置:smallestWidth——基本大小的保障,可用的屏幕區域的最短尺寸所示
限定符值:sw320dp、sw600dp、sw720dp等
例如,如果您的布局要求,其最小尺寸的屏幕區域至少600dp在任何時候,然後你可以使用這個qualifer創建布局資源,res/layout-sw600dp/。系統將使用這些資源時,才可用屏幕的最小尺寸至少600dp,無論600dp側是用戶感知的高度或寬度。SmallestWidth是設備的一個固定的屏幕大小特征;設備的smallestWidth不會更改屏幕方向更改時.
(5)配置:可用寬度——指定最小的可用屏幕寬度,dp單位應使用資源——由
此配置值會改變方向之間橫向和縱向以匹配當前的實際寬度發生變化時。
限定符值:w720dp、w1024dp等
(6)配置:可用高度——最低可用的屏幕高度,指定應該使用該資源的"dp"單位——由
此配置值會改變方向之間橫向和縱向以匹配當前的實際高度發生變化時。
限定符值:h720dp、h1024dp等
(7)配置:屏幕大小
限定符值:
small:到低密度的QVGA屏幕大小相似的屏幕。
normal:中等密度HVGA屏幕大小相似的屏幕。
large:中等密度VGA屏幕大小相似的屏幕。
xlarge:大大大於傳統介質密度HVGA屏幕的屏幕
(8)配置:圓形屏幕
限定符值:
round圓如圓可穿戴設備的屏幕
notround矩形屏幕,如手機或平板電腦
(9)配置:屏幕方向
限定符值:
port設備是縱向(垂直)
land設備是橫向(水平)
(10)配置:用戶界面模式
限定符值:
car把車停靠在展示設備
desk設備顯示在一個桌子上碼頭
television設備顯示在電視上提供其UI在哪裡用戶距離遙遠的大屏幕的"十腳"經驗,
主要圍繞DPAD或其他非指針交互。
appliance設備服務作為一種裝置,與無顯示
watch設備具有顯示和戴在手腕上
(11)配置:夜間模式
限定符值:
night晚上的時間
notnight一天時間
(12)配置:屏幕像素密度
限定符值:
ldpi低密度屏幕;大約120dpi。
mdpi中等密度(在傳統的HVGA)屏幕;大約160dpi
hdpi 高密度屏幕;大約240dpi
xhdpiExtra-high-density屏幕;大約320dpi。添加在API級別8
xxhdpi外超高密度屏幕;大約480dpi。添加在API級別16
xxxhdpi超-超額外--高密度用途(啟動器圖標,只見在支持多屏幕的注意);大約640dpi。添加在API級別18
nodpi這可以用於你不想要縮放,以匹配設備密度的位圖資源
tvdpi屏幕介於mdpi和下;約213dpi。這不是"主"密度組。它主要用於電視機和大多數應用程序不應該需要它。
(13)配置:觸摸屏類型
限定符值:
notouch設備沒有觸摸屏
finger設備已打算用於通過用戶的手指的雙向互動的觸摸屏。此外看到touchscreen配置字段,
指示設備上的觸摸屏的類型。
(14)配置:鍵盤可用性
限定符值:
keysexposed設備有可用的鍵盤。
keyshidden設備具有可用的硬件鍵盤,但它是隱藏和設備不啟用軟件鍵盤。
keyssoft設備已啟用,軟件鍵盤是否可見。
(15)配置:主要文本輸入法
限定符值:
nokeys設備有沒有硬件鍵進行文本輸入。
qwerty設備具有一個硬件qwerty鍵盤,是否對用戶可見。
12key設備具有硬件12鍵鍵盤,是否對用戶可見。
(16)配置:導航關鍵可用性
限定符值:
navexposed導航鍵是提供給用戶。
navhidden導航鍵不可用(如背後密封蓋子)。
(17)配置:主的非接觸式導航方法
限定符值:
nonav設備有沒有使用觸摸屏的導航設施。
dpad設備具有定向墊(d-墊)為導航
trackball設備已用於導航的軌跡球
wheel設備已用於導航(罕見)定向(第)。
(18)配置:平台版本(API級別)
限定符值:v3、v4、v7等。
4,限定符命名規則:
(1)可以指定一組資源,以短劃線分隔的多個限定符;
(2)限定符必須在表2中列出的順序。例如:
錯誤:drawable-hdpi-port/
正確:drawable-port-hdpi/
(3)不能嵌套替代資源目錄。例如,您不能有res/drawable/drawable-en/.
(4)值不區分大小寫。資源編譯器前處理,以避免在不區分大小寫的文件系統上的問題,將目錄名稱轉換為小寫字母。
名稱中的任何大寫只是受益的可讀性。
(5)支持每個限定符類型只有一個值。例如,如果您想要使用相同的可繪制文件為西班牙和法國,你不能有一個名為
目錄drawable-rES-rFR/。相反你需要兩個資源目錄,如drawable-rES/和drawable-rFR/,其中包含相應的文件。
5,下面是用常見的一些類型的手機總結的一個表格,可以簡單做一下參考:
四、屏幕的分類
1)以總像素數分,文本的size等都要改,如下圖所示:
每一個分類都有其最小分辨率,如下,可根據分辨率劃分種類:
2)以屏幕密度分,提供不同的圖片,如下圖所示:
五、屏幕的適配
掌握了以上的知識,我們現在開始來對Android進行屏幕適配:
Android的多屏幕支持的基礎是它能夠根據當前屏幕配置以適當的方式管理提出申請的布局和位圖渲染能力。
系統處理的大部分工作是以適應屏幕尺寸/密度縮放布局和擴展位圖以適應屏幕像素密度。
你應該確信你應用程序布局:
適合在小屏幕(這樣用戶實際上可以使用您的應用程序);
為更大的屏幕,以利用額外的屏幕空間優化;
針對橫向和縱向方向優化。
1,在manifest中顯示聲明應用程序支持的屏幕尺寸清單
設置多分辨率支持,代碼如下所示:
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true"/>
注解:
android:anyDensity="true",系統會依據屏幕密度,自動去找對應的文件夾
android:requiresSmallestWidthDp
android:compatibleWidthLimitDp
android:largestWidthLimitDp
以上這三個屬性也是寫在supports-screens中,但我們一般不用它,這裡就不多做解釋了,若想要了解詳情請查看鏈接:http://developer.android.com/guide/practices/screens_support.html
2,圖片適配
為不同的屏幕密度提供不同的位圖畫板。不同像素密度的手機加載工程資源文件(res)中不同資源圖片。Android有個自動匹配機制去選擇對應的布局和圖片資源
從Android1.6(API4)開始,Android提供了多種屏幕尺寸和密度,反映了多種不同的設備可能支持屏幕配置。
Android把實際的屏幕尺寸和密度分成如下范圍:
官方指定標准:
雖然Android也支持低像素密度(LDPI)的屏幕,但無需為此費神,系統將自動將HDPI尺寸的圖標縮小到1/2進行匹配。
比如下面就是一些在各個屏幕密度裡面的尺寸:
按照以上計算方式,大致可以將市場上的手機劃分為5個像素密度等級,具體如下:
(1)ldpi:120dpi,像素密度與dp轉換關系為:1dp=0.75px
(2)mdpi:160dpi,像素密度與dp轉換關系為:1dp=1px
(3)hdpi:240dpi,像素密度與dp轉換關系為:1dp=1.5px
(4)xhdpi:320dpi,像素密度與dp轉換關系為:1dp=2px
(5)xxhdpi:480dpi,像素密度與dp轉換關系為:1dp=3px
我們可使用屏幕像素密度限定符來創建不同的圖片文件夾,如下圖所示:
注意:上圖各種文件夾的不同表示。
drawable-hdpi該圖片即適用於橫屏,也適用於豎屏
drawable-land-hdpi,當屏幕為橫屏,且為高密度時,加載此文件夾中的資源
drawable-port-hdpi,當屏幕為豎屏,且為高密度時,加載此文件夾中的資源
ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi:像素密度比例縮放為1:2:3:4:6:8
在有關圖片的適配時,我們需要把合適大小的圖片放在合適的位置,如下圖所示:
支持多個屏幕的目的是創建一個應用程序可以正常工作,可以在任何支持的安卓系統的廣義的屏配置看起來不錯。
關於高清設計圖尺寸
Google官方給出的高清設計圖尺寸有兩種方案,一種是以mdpi設計,然後對應放大得到更高分辨率的圖片,另外一種則是以高分辨率作為設計大小,然後按照倍數對應縮小到小分辨率的圖片。據經驗,我更推薦第二種方法,因為小分辨率在生成高分辨率圖片的時候,會出現像素丟失,我不知道是不是有方法可以阻止這種情況發生。
而分辨率可以以1280*720或者是1960*1080作為主要分辨率進行設計。
Android尋找最佳資源原理:
1,排除與設備設置不符合的資源
2,根據限定詞(qualifier)的優先級,按照順序查找
3,在限定詞下,是否存在資源路徑
4,排除不包含在限定詞中的資源路徑
5,繼續執行不同的限定詞查找,直到找到相應的資源
詳細解釋:
(1)首先會去比自己密度高的目錄裡去找,這是因為因為系統相信,你在密度更高的目錄裡會放置分辨率更
大的圖片,這樣的話這個圖片會被縮小,但同時顯示效果不會有損失,但是如果優先去低一級別的目錄去找的話,找到的圖片就會被放大,這樣的話這個圖片就會被拉扯模糊了。
e.g. 同一張圖片,你在mdpi和xxhdpi目錄各放了一份, 這個應用你現在運行在hdpi的手機上, 那應用會選擇哪張圖片呢。答案是xxhdpi目錄裡的。即便hdpi離mdpi更近一點!
(2)如果在mdpi裡找不到是不會直接去ldpi裡找的, 而是先去默認的drawble目錄裡找,這是drawble目錄
和drawble-mdpi是一個級別的。
(3)如果drawable-hdpi,drawable-mdpi,drawable-ldpi三個文件夾中有同一張圖片資源的不同密度表示,
那麼系統會去加載drawable_mdpi文件夾中的資源。
(4)如果drawable-hpdi中有高密度圖片,其它兩個文件夾中沒有對應圖片資源,那麼系統會去加載
drawable-hdpi中的資源。
(5)如果drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒有對應的圖片資源,
那麼系統會加載drawable-mdpi文件夾中的資源 。
3,布局文件適配
為不同的屏幕尺寸提供不同的布局。
根據配置限定符,你可以用它來提供大小的特定資源,比如小,正常,大和超大 。
例如,超大屏幕布局應該在文件夾layout-xlarge /下面 。
從Android 3.2 ( API等級13 )起,上述尺寸組已過時,應改用sw dp配置限定符來定義你的布局資源所需的最小可用寬度。例如,如果你的平板電腦的布局至少需要600dp屏幕寬度,你應該把它放在文件夾layout-sw600dp /下 。在有關平板布局的聲明在Android 3.2節進一步討論。
布局可以使用的限定符是:
smallestWidth——基本大小的保障,可用的屏幕區域的最短尺寸所示:
sw320dp、sw600dp、sw720dp等
屏幕大小:small、normal、large、xlarge
屏幕方向:port(垂直)、land(水平)
實際的物理尺寸,指屏幕的對角線的長度(單位inch-英寸)。
1英寸=2.54厘米。常見屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等
可創建的layout:若有layout-normal和layout-1920x12080的話,會執行layout-normal,
下面是布局layout根據限定配置符所創建的文件:
注意:裡面的布局文件名相同,文件裡面的控件id也是相同
對於最小寬度大於等於 600 dp 的設備,系統會選擇 layout-sw600dp/main.xml(雙面板)布局,否則系統就會選擇 layout/main.xml(單面板)布局。
但 Android 版本低於 3.2 的設備不支持此技術,原因是這些設備無法將 sw600dp 識別為尺寸限定符,因此我們仍需使用 large 限定符。這樣一來,就會有一個名稱為 res/layout-large/main.xml 的文件(與 res/layout-sw600dp/main.xml 一樣)
注意:可以查詢一下API所對應的版本,13代表的是3.2版本
注意:當你使用多個限定符時要按照限定符順序,否則,資源將被忽略。
這裡是關於如何你可以確保您的應用程序在不同的屏幕上顯示正確的快速清單:
(1)不要使用絕對布局
(2)盡量使用match_parent 而不是fill_parent 。
(3)能夠使用權重的地方盡量使用權重(android:layout_weight)
(4)如果是純色背景,盡量使用android的shape 自定義。
(5)如果需要在特定分辨率下適配,可以在res目錄上新建layout-HxW.xml的文件夾。比如要適配1080*1800的屏幕(魅族MX3采用此分辨率)則新建layout-1800x1080.xml的文件夾,然後在下面定義布局。Android系統會優先查找分辨率相同的布局,如果不存在則換使用默認的layout下的布局。
(6)ImageView的ScaleType屬性
設置不同的ScaleType會得到不同的顯示效果,一般情況下,設置為centerCrop能獲得較好的適配效果。
注意:
使用 “wrap_content”,系統就會將視圖的寬度或高度設置成所需的最小尺寸以適應視圖中的內容,而 “match_parent”(在低於 API 級別 8 的級別中稱為 “fill_parent”)則會展開組件以匹配其父視圖的尺寸。如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬編碼的尺寸,視圖就會相應地僅使用自身所需的空間或展開以
填滿可用空間。此方法可讓布局正確適應各種屏幕尺寸和屏幕方向。
示例代碼:
http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.student.android_screenadaptation.MainActivity">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="為了屏幕的多適配,我們可以要多用
match_parent或wrap_content,以及下面布局
中的線性布局的android:layout_weight屬性,"/>
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2.0"
android:background="@color/gw_dark_orange"
android:gravity="center"
android:orientation="horizontal">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="這邊占用了2份"/>
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:background="@color/gw_default_blue"
android:gravity="center"
android:orientation="horizontal">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="這邊占用了1份"/>
顯示的效果:
在開發中,我們大部分時候使用的都是線性布局、相對布局和幀布局,絕對布局由於適配性極差,所以極少使用。
3,dimens.xml文件適配
Value所創建的文件夾及文件如下所示:
具體情況就不說了,下面的這個博客鏈接裡面講解的很清楚,大家可以參考:
http://blog.csdn.net/lmj623565791/article/details/45460089
4,java代碼適配
通過android相應api獲取當前手機的寬高像素值,按比例分配屏幕中控件的寬高以達到適配效果。
下面是布局和實現功能的核心代碼:
獲取屏幕尺寸:
/*定義DisplayMetrics對象*/
DisplayMetricsdm=newDisplayMetrics();
/*取得窗口屬性*/
getWindowManager().getDefaultDisplay().getMetrics(dm);
/*窗口的寬度*/
intscreenWidth=dm.widthPixels;
/*窗口的高度*/
intscreenHeight=dm.heightPixels;
Android全屏顯示、橫豎屏設置:
一般程序在運行時屏幕頂部都帶有標題欄和系統信息欄
但在游戲開發時為了美觀,我們就需要全屏顯示:
通過requestWidowFeature方法可以設置標題欄是否顯示,通過setFlags方法可以設置全屏模式
通過setRequestedOrientation方法將顯示模式設置為橫屏模式。
@Override
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
/*設置為無標題欄*/
requestWindowFeature(Window.FEATURE_NO_TITLE);
/*設置為全屏模式*/
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
/*設置為橫屏*/
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.main);
}
Android屏幕適配項目模板下載地址:https://git.oschina.net/22889/Android_ScreenSmartScale.git
僅供參考,如果您有更好的方法,歡迎討論,歡迎分享
Android TextView 改變字體主要有兩種方法: 1、Html.fromHtml 獲取一個用html格式表示的Spanned。 2、另一種方式
本文實例講述了Android編程實現讀取手機聯系人、撥號、發送短信及長按菜單操作方法。分享給大家供大家參考,具體如下:1.Andrid項目結構圖↓主要操作圖中紅色方框內的
前言:經過昨天的學習,感覺對socket越來越熟悉了,但還是得多寫寫。業精於勤荒於嬉,行成於思毀於隨!今天我寫了一個與項目稍微接近的一個小程序。對socket越來越深入了
說明:android的線程使用。android的線程無非就是Main Thread和Worker Thread。(除了主線程Main Thread之外的其他線程都是Wor