淺談 Android 屏幕適配

幾組概念

分辨率
屏幕上物理像素的總數(shù)箭昵。添加對(duì)多種屏幕的支持時(shí)狭姨, 應(yīng)用不會(huì)直接使用分辨率拨拓;而只應(yīng)關(guān)注通用尺寸和密度組指定的屏幕尺寸及密度。

屏幕尺寸: 按屏幕對(duì)角測(cè)量的實(shí)際物理尺寸服猪。目前市面上說(shuō)的幾英寸是對(duì)角線(xiàn)的英寸數(shù)
為簡(jiǎn)便起見(jiàn)供填,Android 將所有實(shí)際屏幕尺寸分組為四種通用尺寸:小拐云、 正常、大和超大近她。(太寬泛了, 現(xiàn)在已不建議使用)

DPI(Dots Per Inch):每英寸點(diǎn)數(shù)叉瘩,表示指屏幕密度。是測(cè)量空間點(diǎn)密度的單位粘捎,最初應(yīng)用于打印技術(shù)中薇缅,它表示每英寸能打印上的墨滴數(shù)量。較小的 DPI 會(huì)產(chǎn)生不清晰的圖片攒磨。
后來(lái)DPI的概念也被應(yīng)用到了計(jì)算機(jī)屏幕上泳桦,計(jì)算機(jī)屏幕一般采用 PPI(Pixels Per Inch)來(lái)表示一英寸屏幕上顯示的像素點(diǎn)的數(shù)量,現(xiàn)在 DPI 也被引入娩缰。

為簡(jiǎn)便起見(jiàn)灸撰,Android 將所有屏幕密度分組為六種通用密度

屏幕像素密度 ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi
描述 低密度屏幕 中等密度 高密度屏幕 超高密度屏幕 - -
約為 ~120dpi ~160dpi ~240dpi ~320dpi ~480dpi ~640dpi
之間的縮放比 3 4 6 8 12 16
? 0.75x 1.0x 1.5x 2.0x 3.0x 4.0x

PPI(Pixels Per Inch):圖像分辨率;是每英寸圖像內(nèi)有多少個(gè)像素點(diǎn)拼坎,分辨率的單位為ppi浮毯,通常叫做像素每英寸。圖像分辨率一般被用于ps中泰鸡,用來(lái)改變圖像的清晰度债蓝。

密度無(wú)關(guān)像素 (dp)
在定義 UI 布局時(shí)應(yīng)使用的虛擬像素單位,用于以密度無(wú)關(guān)方式表示布局維度或位置盛龄。
密度無(wú)關(guān)像素等于 160 dpi 屏幕上的一個(gè)物理像素饰迹,這是 系統(tǒng)為“中”密度屏幕假設(shè)的基線(xiàn)密度。在運(yùn)行時(shí)讯嫂,系統(tǒng) 根據(jù)使用中屏幕的實(shí)際密度按需要以透明方式處理 dp 單位的任何縮放 蹦锋。dp 單位轉(zhuǎn)換為屏幕像素很簡(jiǎn)單: px = dp * (dpi / 160)
例如欧芽,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素葛圃。在定義應(yīng)用的 UI 時(shí)應(yīng)始終使用 dp 單位 千扔,以確保在不同密度的屏幕上正常顯示 UI。

支持每種密度的 位圖可繪制對(duì)象的相對(duì)大小

適配方案

密度獨(dú)立性

應(yīng)用顯示在密度不同的屏幕上時(shí)库正,如果它保持用戶(hù)界面元素的物理尺寸(從 用戶(hù)的視角)曲楚,便可實(shí)現(xiàn)“密度獨(dú)立性” 。
Android 系統(tǒng)可幫助您的應(yīng)用以?xún)煞N方式實(shí)現(xiàn)密度獨(dú)立性:

  • 系統(tǒng)根據(jù)當(dāng)前屏幕密度擴(kuò)展 dp 單位數(shù)
  • 系統(tǒng)在必要時(shí)可根據(jù)當(dāng)前屏幕密度將可繪制對(duì)象資源擴(kuò)展到適當(dāng)?shù)拇笮?
    • nodpi:它可用于您不希望縮放以匹配設(shè)備密度的位圖資源褥符。例如.9圖推薦放在此目錄
    • anydpi:此限定符適合所有屏幕密度龙誊,其優(yōu)先級(jí)高于其他限定符。 這對(duì)于矢量可繪制對(duì)象很有用喷楣。 此項(xiàng)為 API 級(jí)別 21 中新增配置

最佳做法

  • 使用新尺寸限定符
    smallestWidth (sw<N>dp)

屏幕的基本尺寸趟大,由可用屏幕區(qū)域的最小尺寸指定鹤树。 具體來(lái)說(shuō),設(shè)備的smallestWidth 是屏幕可用高度和寬度的最小尺寸(您也可以將其視為屏幕的“最小可能寬度”)逊朽。無(wú)論屏幕的當(dāng)前方向如何罕伯,您均可使用此限定符確保應(yīng)用 UI 的可用寬度至少為 <N>dp。

例如叽讳,如果布局要求屏幕區(qū)域的最小尺寸始終至少為 600 dp,則可使用此限定符創(chuàng)建布局資源 res/layout-sw600dp/。僅當(dāng)可用屏幕的最小尺寸至少為 600dp 時(shí)荔棉,系統(tǒng)才會(huì)使用這些資源到涂,而不考慮 600dp 所代表的邊是用戶(hù)所認(rèn)為的高度還是寬度。smallestWidth 是設(shè)備的固定屏幕尺寸特性涤妒;設(shè)備的 smallestWidth 不會(huì)隨屏幕方向的變化而改變推溃。

設(shè)備的 smallestWidth 將屏幕裝飾元素和系統(tǒng) UI 考慮在內(nèi)。例如届腐,如果設(shè)備的屏幕上有一些永久性 UI 元素占據(jù)沿 smallestWidth 軸的空間铁坎,則系統(tǒng)會(huì)聲明 smallestWidth 小于實(shí)際屏幕尺寸,因?yàn)檫@些屏幕像素不適用于您的 UI犁苏。

這可替代通用化的屏幕尺寸限定符(小硬萍、正常、大围详、超大)朴乖, 可讓您為 UI 可用的有效尺寸定義不連續(xù)的數(shù)值。 使用 smallestWidth 定義一般屏幕尺寸很有用助赞,因?yàn)閷挾?通常是設(shè)計(jì)布局時(shí)的驅(qū)動(dòng)因素买羞。UI 經(jīng)常會(huì)垂直滾動(dòng),但 對(duì)其水平需要的最小空間具有非常硬性的限制雹食⌒笃眨可用的寬度也是 確定是否對(duì)手機(jī)使用單窗格布局或是對(duì)平板電腦使用多窗格布局的關(guān)鍵因素。因此群叶,您可能最關(guān)注每部 設(shè)備上的最小可能寬度吃挑。
最小寬度限定符可讓您通過(guò)指定某個(gè)最小寬度(以 dp 為單位)來(lái)定位屏幕。例如街立,標(biāo)準(zhǔn) 7 英寸平板電腦的最小寬度為 600 dp舶衬,因此如果您要在此類(lèi)屏幕上的用戶(hù)界面中使用雙面板(但在較小的屏幕上只顯示列表),您可以使用上文中所述的單面板和雙面板這兩種布局赎离,但您應(yīng)使用 sw600dp 指明雙面板布局僅適用于最小寬度為 600 dp 的屏幕逛犹,而不是使用 large 尺寸限定符。

  • 在 XML 布局文件中指定尺寸時(shí)使用 wrap_content、match_parent 或 dp 單位 虽画。
  • 不要在應(yīng)用代碼中使用硬編碼的像素值
  • 不要使用 AbsoluteLayout(已棄用), 而是考慮線(xiàn)性布局使用權(quán)重分配寬高, support庫(kù)中約束布局, 可以是布局更加扁平化
  • 為不同屏幕密度提供替代位圖可繪制對(duì)象

圖標(biāo)的適配

在進(jìn)行開(kāi)發(fā)的時(shí)候舞蔽,我們需要把合適大小的圖片放在合適的文件夾里面。下面以圖標(biāo)設(shè)計(jì)為例進(jìn)行介紹狸捕。

在設(shè)計(jì)圖標(biāo)時(shí)喷鸽,對(duì)于五種主流的像素密度(MDPI、HDPI灸拍、XHDPI做祝、XXHDPI 和XXXHDPI)應(yīng)按照 2:3:4:6:8 的比例進(jìn)行縮放。
雖然 Android 也支持低像素密度 (LDPI) 的屏幕鸡岗,但無(wú)需為此費(fèi)神混槐,系統(tǒng)會(huì)自動(dòng)將 HDPI 尺寸的圖標(biāo)縮小到 1/2 進(jìn)行匹配。
建議以高分辨率作為設(shè)計(jì)大小轩性,然后按照倍數(shù)對(duì)應(yīng)縮小到小分辨率的圖片声登。
一般情況下,我們只需要提供3套切圖資源就可以滿(mǎn)足安卓工程師的適配揣苏,分別是 HDPI悯嗓、XHDPI、 XXHDPI 3套切圖資源卸察。
推薦使用的辦法就是只提供最大尺寸的切圖脯厨,xxhdpi 的高清圖, 然后可以交給安卓工程師自己去縮放適配其他分辨率。

圖標(biāo)的各個(gè)屏幕密度的對(duì)應(yīng)尺寸

.9圖自動(dòng)拉伸

ImageView的ScaleType屬性

設(shè)置 不同的 ScaleType 會(huì)得到不同的顯示效果坑质,一般情況下合武,設(shè)置為 centerCrop 能獲得較好的適配效果。fixXY 可能導(dǎo)致變形.

動(dòng)態(tài)設(shè)置

  • 有一些情況下涡扼,我們需要?jiǎng)討B(tài)的設(shè)置控件大小或者是位置稼跳,比如說(shuō) popwindow 的顯示位置和偏移量等,這個(gè)時(shí)候我們可以動(dòng)態(tài)的獲取當(dāng)前的屏幕屬性吃沪,然后設(shè)置合適的數(shù)值
  • 使用官方百分比布局
dependencies{
    compile'com.android.support:percent:25.1.0'
}

使用布局別名

最小寬度限定符僅適用于 Android 3.2 及更高版本汤善。因此,如果我們?nèi)孕枋褂门c較低版本兼容的概括尺寸范圍(小巷波、正常萎津、大和特大)。例如抹镊,如果要將用戶(hù)界面設(shè)計(jì)成在手機(jī)上顯示單面板,但在 7 英寸平板電腦荤傲、電視和其他較大的設(shè)備上顯示多面板垮耳,那么我們就需要提供以下文件:

res/values-large/layout.xml:

res/values-sw600dp/layout.xml:

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子终佛,更是在濱河造成了極大的恐慌俊嗽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铃彰,死亡現(xiàn)場(chǎng)離奇詭異绍豁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)牙捉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)竹揍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人邪铲,你說(shuō)我怎么就攤上這事芬位。” “怎么了带到?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵昧碉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我揽惹,道長(zhǎng)被饿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任搪搏,我火速辦了婚禮狭握,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慕嚷。我一直安慰自己哥牍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布喝检。 她就那樣靜靜地躺著嗅辣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挠说。 梳的紋絲不亂的頭發(fā)上澡谭,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音损俭,去河邊找鬼蛙奖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杆兵,可吹牛的內(nèi)容都是我干的雁仲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼琐脏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼攒砖!你這毒婦竟也來(lái)了缸兔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吹艇,失蹤者是張志新(化名)和其女友劉穎惰蜜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體受神,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抛猖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼻听。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财著。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖精算,靈堂內(nèi)的尸體忽然破棺而出瓢宦,到底是詐尸還是另有隱情,我是刑警寧澤灰羽,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布驮履,位于F島的核電站,受9級(jí)特大地震影響廉嚼,放射性物質(zhì)發(fā)生泄漏玫镐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一怠噪、第九天 我趴在偏房一處隱蔽的房頂上張望恐似。 院中可真熱鬧,春花似錦傍念、人聲如沸矫夷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)双藕。三九已至,卻和暖如春阳仔,著一層夾襖步出監(jiān)牢的瞬間忧陪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工近范, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘶摊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓评矩,卻偏偏與公主長(zhǎng)得像叶堆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斥杜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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