Android相對(duì)屏幕適配原理與方案
描述一塊屏幕的大小,可以從屏幕各個(gè)參數(shù)入手,其中比較重要的三個(gè)參數(shù)分別是尺寸、分辨率以及密度。
尺寸
以對(duì)角線長(zhǎng)度為準(zhǔn),單位inch。
分辨率
橫向像素×縱向像素,單位pixel。
密度
單位長(zhǎng)度上的像素?cái)?shù),單位ppi(pixels per inch)或dpi(dots per inch)。
Android開(kāi)發(fā)中能夠有效地描述一塊屏幕的參數(shù)是密度。根據(jù)密度的不同劃分了大致的幾個(gè)范圍:
- ldpi(≈120dpi)
- mdpi(≈160dpi)
- hdpi(≈240dpi)
- xhdpi(≈320dpi)
- xxhdpi(≈480dpi)
- xxxhdpi(≈640dpi)
xxhdpi以上的設(shè)備的像素點(diǎn),一般人眼已經(jīng)看不出,再高也只是增加圖像顯示銳化,徒增電量損耗耳。
為了使用密度來(lái)描述屏幕,Android推薦使用dp作為UI尺寸的度量單位而不是傳統(tǒng)的px。所謂dp是density independent pixel的縮寫(xiě),即密度無(wú)關(guān)像素,開(kāi)發(fā)人員在布局UI時(shí),透明地將dp當(dāng)作是px來(lái)使用,SDK會(huì)根據(jù)設(shè)備屏幕的密度轉(zhuǎn)換為對(duì)應(yīng)的實(shí)際px值。dp的定義是160dpi的屏幕下,實(shí)際的1px就是1dp,而在其它的密度的屏幕下,1dp對(duì)應(yīng)的px值就要按比例縮放。公式如下:
valueInPX = valueInDP × (density / 160)
因此:
1dp在各個(gè)密度屏幕下對(duì)應(yīng)的px數(shù)分別為:
- ldpi
valueInPx = 1 × (120 / 160) = 0.75
即0.75px,而屏幕無(wú)法呈現(xiàn)0.75px,所以相當(dāng)于4dp對(duì)應(yīng)3px。
- mdpi
valueInPx = 1 × (160 / 160) = 1
標(biāo)準(zhǔn)的一一對(duì)應(yīng)。
- hdpi
valueInPx = 1 × (240 / 160) = 1.5
同理相當(dāng)于2dp對(duì)應(yīng)3px。
- xhdpi
valueInPx = 1 × (320 / 160) = 2
1dp對(duì)應(yīng)2px。
- xxhdpi:
valueInPx = 1 × (480 / 160) = 3
1dp對(duì)應(yīng)3px。
- xxxhdpi:
valueInPx = 1 x (640 / 160) = 4
1dp對(duì)應(yīng)4px。
如圖所示一個(gè)小正方形代表一個(gè)物理像素,4dp在6種密度下對(duì)應(yīng)的像素?cái)?shù)分別為3,4,6,8,12,16??梢钥闯鰔xxhdpi下顯示的UI最精細(xì)。
SDK對(duì)應(yīng)選擇
- res/drawable-ldpi
- res/drawable-mdpi
- res/drawable-hdpi
- res/drawable-xhdpi
- res/drawable-xxhdpi
- res/drawable-xxxhdpi
文件夾下的資源適配屏幕。
在制作Android APP ICON時(shí),對(duì)應(yīng)密度下的官方尺寸為:
- 36×36
- 48×48
- 72×72
- 96×96
- 144×144
- 192×192
所以,在開(kāi)發(fā)Android應(yīng)用時(shí),我們要根據(jù)UI設(shè)計(jì)師的參考尺寸來(lái)放置切圖,比如,我們的應(yīng)用需要顯示一個(gè)寬度大約是屏幕一半的logo,設(shè)計(jì)師從1080x1920的設(shè)計(jì)圖導(dǎo)出該logo,我們就應(yīng)該擺放至res/drawable-xxhdpi下,這樣即使運(yùn)行該App的手機(jī)是720x1280或1440x2560或其它分辨率,logo顯示效果也大致是屏幕的一半。當(dāng)然,Android手機(jī)將切圖由大轉(zhuǎn)小的效果優(yōu)于由小轉(zhuǎn)大,所以切圖的參考屏幕尺寸越大,各分辨率手機(jī)顯示整體效果越好。最理想情況是針對(duì)6大密度切6張圖,但是權(quán)衡目標(biāo)用戶各分辨率手機(jī)市場(chǎng)占有率及UI工作量,一般情況切一款即可滿足。
現(xiàn)在主流Android手機(jī)的屏幕尺寸是720x1280與1080x1920,1440x2560會(huì)越來(lái)越多,還有一些特殊的尺寸(比如魅族的機(jī)型),也就是說(shuō)屏幕密度集中于xhdpi~xxxhdpi,可以參考網(wǎng)址screensiz.es。
總結(jié)如下表所示
name | icon size | scope | 代表屏幕 | scale |
---|---|---|---|---|
ldpi | 36x36 | 0~120dpi | 現(xiàn)在鮮有 | 0.75 |
mdpi | 48x48 | 120~160dpi | 320x480 | 1 |
hddpi | 72x72 | 160~240dpi | 480x800 | 1.5 |
xhdpi | 96x96 | 240~320dpi | 720x1280 | 2 |
xxhdpi | 144x144 | 320~480dpi | 1080x1920 | 3 |
xxxhdpi | 192x192 | 480~640dpi | 1440x2560 | 4 |
以上闡述的屏幕適配方法是相對(duì)適配,關(guān)于Android相對(duì)屏幕適配的方法代碼參見(jiàn)AndroidScreenMatchingUtil。
Android絕對(duì)屏幕適配原理與方案
Android SDK已經(jīng)為我們做好了相對(duì)屏幕適配的方案,即采用DP作為UI尺寸的描述單位,絕對(duì)屏幕適配方案則希望精確描述UI尺寸,力求UI在所有設(shè)備上顯示效果一致。
已經(jīng)實(shí)現(xiàn)的方案有
基本思想是采用百分比來(lái)描述UI尺寸。
示例代碼參見(jiàn)lib-app-screen