Android屏幕適配
概述
屏幕適配的主要目標(biāo)有兩個崖蜜,不同屏幕尺寸的適配和不同像素密度的適配。隨著手機(jī)行業(yè)發(fā)展異形屏也開始流行纱注,異形屏幕適配也日漸重要(Android 9 (API level 28)開始提供官方支持)惜浅。
適配不同的屏幕尺寸
適配方法:
- RelativeLayout可以在不同尺寸的屏幕上保留視圖組件的空間位置關(guān)系
- 使用尺寸限定符(layout-large)針對不同尺寸屏幕提供多種備選布局
- 使用最小寬度限定符(layout-sw600dp,寬度大于等于600dp的屏幕肝匆,需要Android3.2及以上系統(tǒng))針對不同尺寸屏幕提供多種備選布局。
- 使用屏幕方向限定符針對不同尺寸和方向的屏幕提供多種備選布局顺献。
- 使用九宮格位圖(.9)支持尺寸可能改變的視圖組件顯示圖像資源
適配不同的屏幕密度
密度無關(guān)單位:dp(設(shè)備獨(dú)立像素)或sp(縮放獨(dú)立像素)旗国,不同像素密度下可以提供相同的物理尺寸顯示效果。
- dpi:設(shè)備像素密度注整,這是一個軟件系統(tǒng)中的概念能曾,用于代表設(shè)備像素密度的一個級別。是可以修改的
- ppi:物理像素密度设捐,這是硬件中的參數(shù),代表每英寸屏幕的像素個數(shù)塘淑。不能修改萝招,只和屏幕物理特性有關(guān)。一般一定范圍內(nèi)的ppi對應(yīng)同一個dpi存捺。
- px:像素pixel的簡寫槐沼,代表屏幕的一個像素點(diǎn)
- dp:像素密度無關(guān)的一個單位,代表160dpi下的屏幕物理尺寸捌治,dp=(dpi/160)*px,在不同像素密度下1dp對應(yīng)不同的像素(px)值岗钩。
- sp:scaled pixels,縮放像素肖油,用于文字大小適配兼吓。sp會跟隨系統(tǒng)字體設(shè)置大小進(jìn)行縮放。
適配方法:
- 使用分辨率無關(guān)計量單位dp/sp適配不同屏幕密度
- 提供針對不同屏幕像素密度的備用位圖資源(ldpi-0.75 mdpi-1.0 hdpi-1.5 xhdpi-2.0 xxhdpi-3.0 xxxhdpi-4.0)
一些原則
- 避免對界面組件的大小和位置進(jìn)行硬編碼
- 使用布局別名減少重復(fù)的布局文件森枪。
適配方案
-
寬高限定符適配
Android中有提供了一種關(guān)于尺寸的資源類型视搏,Dimension,她可以定義一系列數(shù)值單位的尺寸值县袱,可以使dp浑娜、px、sp式散、pt筋遭、mm、in中的一種,位于res/values/filename.xml下漓滔,資源可以通過一些限定符指定給不同的尺寸编饺、像素密度的設(shè)備使用。所以我們可以根據(jù)寬高限定符生成多套Dimension資源文件針對不同屏幕下的尺寸次和,文件一般類似:values-480x320反肋。一般是以某一像素密度下的尺寸為基準(zhǔn),其他密度按照比例進(jìn)行縮放踏施。寬高限定符的特點(diǎn)是只針對指定分辨率的屏幕石蔗。所以想要完美的適配所有屏幕就需要窮舉市面上所有尺寸的屏幕才可以達(dá)到預(yù)想效果。
-
smallestWidth適配-最小寬度適配
Android中提供了最小寬度限定符畅形,可以識別屏幕可用寬度和高度中較小的一個养距,指定一個尺寸最為接近的資源文件(默認(rèn)會使用不大于自身寬度dp值的資源文件),一般是XX-swxxdp日熬。針對寬高限定符只針對一種尺寸的缺陷棍厌,最小寬度則是匹配最接近的尺寸。很明顯這些資源文件是可以自動生成的:https://github.com/ladingwu/dimens_sw
以上兩種方案都會增大APK文件的大小竖席,根據(jù)資源文件的多寡耘纱,會增大幾十K到幾百K不等。
-
字節(jié)跳動適配方案
該方案通過強(qiáng)制修改設(shè)備中代表dpi的屬性densityDpi和dp px轉(zhuǎn)換關(guān)系的density和sp px轉(zhuǎn)換關(guān)系的scaledDensity毕荐,達(dá)到統(tǒng)一不同設(shè)備尺寸(這里只是統(tǒng)一寬度或者高度一個維度)的目的束析,這樣的適配成本最低,由于修改也是使用公開的api憎亚,穩(wěn)定性也不成問題员寇。
原理:
當(dāng)我們使用dp、sp作為尺寸單位時第美,實(shí)際顯示的像素尺寸根據(jù)公式:px=(dpi/160)*dp計算蝶锋,在默認(rèn)情況下density=dpi/160,根據(jù)設(shè)計稿給出的值和屏幕的實(shí)際像素寬度或者像素高度計算出一個比例值作為density的值什往,這樣在不同尺寸的屏幕上直接使用設(shè)計稿數(shù)值就可以按照百分比填充屏幕扳缕。