Android 屏幕適配教程逛钻、適配機(jī)制介紹

概述

android屏幕適配有很多方面,例如锰提,drawable曙痘,values等,開發(fā)者根據(jù)產(chǎn)品的實(shí)際情況和自己的經(jīng)驗(yàn)立肘,可以選擇性的從其中幾個方面入手边坤。
本文主要介紹一種基于分辨率等比例縮放的適配方案。

幾個必須知道的概念

屏幕尺寸

屏幕尺寸是指手機(jī)屏幕對角線的英寸數(shù)谅年。

屏幕分辨率

屏幕分辨率是指屏幕寬高像素數(shù)惩嘉。

屏幕密度

屏幕密度是指手機(jī)屏幕對角線上單位英寸內(nèi)的像素數(shù)。

代碼中用的尺寸單位(dp,dip,sp,px)

這些單位跟我們寫代碼才是最相關(guān)的踢故。

  • dp即dip文黎,規(guī)定惹苗,密度為160的屏幕上,1像素對應(yīng)的尺寸為1dp耸峭。320密度的屏幕上桩蓉,1像素對應(yīng)0.5dp,以此類推劳闹。在密度為160的屏幕上院究,1英寸有160個像素,那么1px對應(yīng)的尺寸 = 1/160英寸本涕。所以說dp是個物理尺寸业汰,跟像素?zé)o關(guān)。所以菩颖,100dp的尺寸在不同手機(jī)上顯示出來样漆,物理尺寸看上去基本是一樣的。
  • SP 即 Scale-independent Pixel晦闰,即與縮放無關(guān)的抽象像素放祟。sp和dp很類似但唯一的區(qū)別是,Android系統(tǒng)允許用戶自定義文字尺寸大猩胗摇(小跪妥、正常、大声滥、超大等等)眉撵,當(dāng)文字尺寸是“正常”時落塑,1sp=1dp=0.00625英寸纽疟,而當(dāng)文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸
  • px芜赌,即像素仰挣,無需多說

Android適配機(jī)制

  1. drawable,在工程里可以在res目錄下創(chuàng)建一系列的帶后綴的drawable文件夾伴逸,例如drawable-hdpi缠沈,drawable-xhdpi等等。
  • drawable的適配機(jī)制是错蝴,系統(tǒng)會先到后綴與設(shè)備匹配的drawable目錄下找對應(yīng)的圖片洲愤,當(dāng)找不到的時候會去‘更高’一級的目錄去找,再找不到顷锰,繼續(xù)往高一級的找柬赐,再找不到就退而求其次去低一級的找,依次類推官紫。
    例如肛宋,在密度為xxhdpi的手機(jī)上運(yùn)行app州藕,會去drawable-xxhdpi目錄下找圖片資源,找不到就去drawable-xxxhdpi找酝陈,如果沒有比drawable-xxxhdpi更高的床玻,則再找不到就去drawable-xhdpi找,再找不到就去drawable-hdpi找沉帮,直到找到對應(yīng)的圖片資源锈死,當(dāng)找到后,系統(tǒng)會按密度對圖片做縮放處理穆壕,然后再顯示到屏幕上待牵,所以如果圖片放的目錄不對的話,有可能造成圖片模糊喇勋。
  • layout目錄缨该,layout目錄也是可以加后綴的,通常是帶分辨率后綴(當(dāng)然也可以加其他后綴茄蚯,詳見android官網(wǎng)压彭,這里只討論常用的后綴),例如渗常, layout-land-1024x720壮不,layout-1280x720,layout-1920x1080等等皱碘。
  • layout目錄的適配機(jī)制是询一,從“高往低”找最接近的尺寸目錄,例如手機(jī)是1920x1080分辨率的癌椿,但是如果無此layout目錄那么便會低一級的layout-1280x720找布局(而不會去高一級的layout-2560x1440找)健蕊,依次類推,直至找到layout不帶后綴的目錄為止踢俄,如果還沒有缩功,就會報錯。
  • 所以考慮以下場景:
    • 原本我們的布局文件目錄只有l(wèi)ayout一個都办,沒有其他帶后綴的layout目錄
    • 實(shí)際測試中發(fā)現(xiàn)的布局在960x540手機(jī)上有問題嫡锌。
      那么有些人可能會想到加個layout-960x540目錄,然后在此目錄下做特殊處理琳钉。那么問題來了势木,加了這個目錄之后,layout目錄就有兩個歌懒,layout無后綴和layout-960x540啦桌。當(dāng)在1920x1080手機(jī)上運(yùn)行程序時,按照適配機(jī)制及皂,系統(tǒng)會使用layout-960x540目錄下的布局文件甫男,而我們當(dāng)初的初衷是只希望layout-960x540目錄下的布局文件在960x540的手機(jī)上使用且改,所以這種情況下布局肯定會有問題。
      ** 因此板驳,千萬注意上面這種場景钾虐,不要隨意添加‘layout-分辨率’的這種目錄,除非把各種主流分辨率都添加一遍笋庄。碰到這種問題效扫,最好從dimens文件入手做適配,后面會講到直砂。**
  • values目錄之dimens文件菌仁,為了適配不同尺寸的手機(jī),我們可以創(chuàng)建多個values目錄静暂,然后在其中定義dimens尺寸济丘,例如values-1280x720,values-1196x720等等洽蛀。
    • dimens適配的機(jī)制是摹迷,先找跟設(shè)備對應(yīng)的values目錄下的dimens文件中的尺寸定義,找不到則往低一級的找郊供,比如峡碉,在1280x720分辨率的手機(jī)上,如果app中沒有創(chuàng)建values-1280x720目錄驮审,而只有values-1920x1080鲫寄、values-1196x720目錄和默認(rèn)的values目錄,那么系統(tǒng)會去優(yōu)先去values-1196x720的目錄下找對應(yīng)的尺寸疯淫。如果找不到地来,則去默認(rèn)的values找,再找不到就報錯(不會去1920x1080目錄找)熙掺。
      總結(jié):
      1.drawable適配過程:找與設(shè)備密度對應(yīng)的目錄下的圖片-》往更高質(zhì)量的找-》退而求其次找低質(zhì)量的
      2.layout適配過程:找與設(shè)備對應(yīng)的目錄未斑,找不到則從比設(shè)備分辨率低一級的目錄開始依次往下找。
      3.values適配過程:同layout币绩。

基于分辨率等比例縮放的適配方案示例

先看兩張圖:

800x480分辨率.png
1920X1200分辨率.png

上面兩張圖中的登錄按鈕的尺寸是100dp蜡秽,分別在800x480的設(shè)備上和1920x1200的設(shè)備上運(yùn)行效果±嗬耍可以看出來载城,第一張圖按鈕的尺寸跟整體布局還比較協(xié)調(diào)肌似,但是第二張圖中的按鈕寬度顯得特別的小费就,與整體布局很不協(xié)調(diào)。(注意川队,兩個圖中的按鈕力细,在實(shí)際設(shè)備上的物理尺寸是差不多的睬澡,但是為了看起來方面,我將兩張圖都等比例壓縮了眠蚂,但是煞聪,這樣不影響我們看按鈕與整體尺寸比例關(guān)系)。

在實(shí)際界面開發(fā)當(dāng)中逝慧,一般流程是這樣的:
1.UI設(shè)計師基于854x480手機(jī)設(shè)計了一套圖昔脯,并給出了標(biāo)注。
2.開發(fā)人員將標(biāo)注轉(zhuǎn)換為dp寫到布局文件中笛臣。
3.在854x480分辨率的手機(jī)上測試界面效果云稚,不出意外應(yīng)該是跟設(shè)計圖基本一致的。
但是沈堡,如果將程序運(yùn)行到1920x1080分辨率静陈,但是密度為240(hdpi)的設(shè)備上,那就會出現(xiàn)類似上面第二張圖中的效果(當(dāng)然實(shí)際開發(fā)中會把上圖中的按鈕的寬度設(shè)置為match_parent诞丽,這里只是為了說明問題)鲸拥。
界面布局簡單了還好,我們可以通過調(diào)整僧免,使用相對布局以及match_parent等手段將界面調(diào)整的比較好看刑赶。但是如果界面元素比較多了,有時候我們必須給某個控件設(shè)置一個固定尺寸懂衩,所以肯定避免不了這種問題的出現(xiàn)角撞。

所以UI設(shè)計師可能會提出如下幾個要求:
1.設(shè)計師基于720P(1280x720)設(shè)計一套圖,并標(biāo)注
2.研發(fā)開發(fā)出來的實(shí)際效果在720P手機(jī)上必須跟標(biāo)注一致(要求高的公司甚至精確到像素)
3.如果在480P勃痴、1080p手機(jī)上谒所,則實(shí)際尺寸按標(biāo)注等比例縮放。比如在720p上的標(biāo)注是100px沛申,那么顯示到1080p手機(jī)上必須是100*1080/720 = 150px劣领。
4.對于非標(biāo)準(zhǔn)分辨率來說,比如1184x720(手機(jī)底部帶虛擬按鍵的那種)铁材,則需要在高度上做調(diào)整姜挺,給控件的縱向間隙做些調(diào)整。

所以針對如上要求山害,結(jié)合android屏幕適配的機(jī)制嘉涌,可以采用如下方案來適配:

  1. 創(chuàng)建不同分辨率的values文件夾,在其中分別創(chuàng)建dimens.xml:
不同目錄的dimens文件.png
  1. 由于我們的標(biāo)注是基于1280x720分辨率標(biāo)注的饼丘,所以在values-1280x720目錄下的dimens.xml里定義諸如下面這些尺寸:
values-1280x720.png

可以看到趁桃,我對名字的命名有一些規(guī)則,即,寬度值用‘w_像素數(shù)值’的格式命名卫病,高度值用‘h_像素數(shù)值’的格式命名油啤。

  1. 根據(jù)標(biāo)注編寫布局文件,假設(shè)標(biāo)注中‘發(fā)送驗(yàn)證碼’按鈕的寬度為180px


    代碼片段.png

    在720分辨率手機(jī)上對應(yīng)的效果:


    720p.png

    4.根據(jù)values-1280x720目錄下的dimens文件內(nèi)容蟀苛,轉(zhuǎn)換為其他分辨率下的尺寸益咬,然后放到對應(yīng)分辨率的values目錄下。當(dāng)然這種轉(zhuǎn)換手動轉(zhuǎn)會累死帜平。我寫了一個轉(zhuǎn)換工具(一個java類)幽告,轉(zhuǎn)換起來很方便。

好了裆甩。來看下效果评腺,重點(diǎn)關(guān)注‘發(fā)送驗(yàn)證碼’按鈕,為了方便看這個按鈕占據(jù)整個布局的比例淑掌,我把幾張圖都縮放為差不多大休锛ァ:
1.1280x720分辨率:

720p.png

2.1920x1080分辨率:

1080new.png

3.2560x1440:

2k_new.png

上面的方式就是按分辨率等比例縮放的適配方式,我們稱其為第一種適配方式抛腕,另外還有第二種適配方式芋绸,就是我們常用的把寬高用dp來定義的方式。
如果把‘發(fā)送驗(yàn)證碼’按鈕的寬度使用dp來定義担敌,按照180px的標(biāo)注摔敛,那轉(zhuǎn)換為dp按鈕寬度應(yīng)設(shè)置為90dp,那么效果如下:
1.720分辨率全封,密度320dpi马昙,跟上面用px的效果一樣。
2.2560x1440分辨率刹悴,密度560dpi(由于用了dp行楞,所以密度要關(guān)注下):

2k_usedp.png

可以看出按鈕的寬度占整個屏幕寬度的比變小了。分析下原因土匀,按第一種方式子房,即寬度按像素設(shè)定的方式,app運(yùn)行時就轧,@dimen/w_180px在2560x1440分辨率的手機(jī)上會去找values-2560x1440目錄下的dimens文件证杭,而此文件中的尺寸定義已經(jīng)事先被我們按等比例縮放好了,即縮放后的像素= 180 * 1440/720 = 360px
若按第二種方式妒御,即寬度按dp設(shè)定的方式解愤,app運(yùn)行時,90dp在560dpi密度的手機(jī)上送讲,實(shí)際顯示的像素=90*560/160 = 315px奸笤。
那么按鈕寬度占屏幕寬度的比例315:1440小于360:1440所以,所以看起來占用比例小了。

總結(jié)下肥橙,如果要適配各種分辨率的手機(jī)魄宏,并且想讓控件在屏幕中所占用的比例不變,那么就需要用第一種方式來適配存筏。這種方式下宠互,無論屏幕的密度是多少,控件顯示出來后在屏幕中占用的比例都不會變椭坚。
也就是說予跌,如果按這種方式做的話,由于主流分辨率的寬高比基本一致善茎,因此在任何主流分辨率手機(jī)上運(yùn)行后截圖券册,然后再縮放為720寬度,那么界面中的元素位置及大小一定是跟標(biāo)注中一致的垂涯。

以上是對屏幕適配的一些理解烁焙,及實(shí)際測試過后的一些結(jié)論,希望對大家有幫助耕赘。
另外骄蝇,尺寸轉(zhuǎn)換的工具見附件,用java swing組件做了個界面(比較low操骡,湊合用吧):
尺寸轉(zhuǎn)換工具

使用說明:


Paste_Image.png
尺寸轉(zhuǎn)換工具使用.gif

下集預(yù)告:使用Android Studio 中的代碼模板功能九火,提升編碼效率。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末册招,一起剝皮案震驚了整個濱河市岔激,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌是掰,老刑警劉巖鹦倚,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冀惭,居然都是意外死亡震叙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門散休,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒楼,“玉大人,你說我怎么就攤上這事戚丸』罚” “怎么了扔嵌?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夺颤。 經(jīng)常有香客問我痢缎,道長,這世上最難降的妖魔是什么世澜? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任独旷,我火速辦了婚禮,結(jié)果婚禮上寥裂,老公的妹妹穿的比我還像新娘嵌洼。我一直安慰自己,他們只是感情好封恰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布麻养。 她就那樣靜靜地躺著,像睡著了一般诺舔。 火紅的嫁衣襯著肌膚如雪鳖昌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天低飒,我揣著相機(jī)與錄音遗遵,去河邊找鬼。 笑死逸嘀,一個胖子當(dāng)著我的面吹牛车要,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崭倘,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼翼岁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了司光?” 一聲冷哼從身側(cè)響起琅坡,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎残家,沒想到半個月后榆俺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坞淮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年茴晋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片回窘。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡诺擅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啡直,到底是詐尸還是另有隱情烁涌,我是刑警寧澤苍碟,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站撮执,受9級特大地震影響微峰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抒钱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一蜓肆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧继效,春花似錦症杏、人聲如沸装获。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穴豫。三九已至凡简,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間精肃,已是汗流浹背秤涩。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留司抱,地道東北人筐眷。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像习柠,于是被迫代替她去往敵國和親匀谣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容