摘要:下面來看看常見的三種比較成熟的屏幕適配方案,并分析這幾種方案的優(yōu)劣。屏幕適配方案寬高限定符適配設(shè)定一個基準(zhǔn)的分辨率,也就是設(shè)計(jì)圖對應(yīng)的分辨率,其他分辨率都根據(jù)這個基準(zhǔn)分辨率來計(jì)算,在不同的尺寸文件夾內(nèi)部,根據(jù)該尺寸編寫對應(yīng)的文件。
為什么要屏幕適配
Android開發(fā)過程中我們常用的尺寸單位有px、dp,還有一種sp一般是用于字體的大小。但是由于px是像素單位,比如我們通常說的手機(jī)分辨例如1920*1080都是px的單位?,F(xiàn)在Android屏幕分辨率碎片化720x1280、1080x1920、2280x1080,這就造成例如187px會在各個分辨率的機(jī)型上都是顯示一樣大小的,那肯定不是我們想要的效果,所以用px單位我們是難以達(dá)到適配效果的,那么為什么用dp可以呢?
使用px單位從左到右依次為 480 800、1080 1920、1440 * 2560
使用dp單位從左到右依次為 480 800、1080 1920、1440 * 2560
屏幕總寬度依次為 320dp、415dp、411dp
那么什么是dp?dp指的是設(shè)備獨(dú)立像素,以dp為尺寸單位的控件,在不同分辨率和尺寸的手機(jī)上代表了不同的真實(shí)像素,比如在分辨率較低的手機(jī)中,可能1dp=1px,而在分辨率較高的手機(jī)中,可能1dp=2px,這樣的話,一個187dp高度的控件,在不同的手機(jī)中就能表現(xiàn)出差不多的大小了。
dp如何計(jì)算成pxandroid中的dp在渲染前會將dp轉(zhuǎn)為px,計(jì)算公式:
px = density * dp;
density = dpi / 160;
px = dp * (dpi / 160);
而dpi是根據(jù)屏幕真實(shí)的分辨率和尺寸來計(jì)算的,每個設(shè)備都可能不一樣的。
由于density不是固定不變的,所以每個分辨率不同的設(shè)備他們的density都肯定不相等,這樣就會造成每個設(shè)備的寬/高對應(yīng)的總dp都是不同的,假設(shè)480 800分辨率的density是1.5,1080 1920分辨率的density是2.6,1440 * 2560分辨率的density是3.5。那么它們對應(yīng)的寬度總dp = (寬度px) / density,分別為320dp、415dp、411dp??梢钥闯鰡挝粸閐p的時候三個設(shè)備之間的差距就不是很大了,但是這樣肯定還是不能滿足我們對屏幕適配的要求的。下面來看看Android常見的三種比較成熟的屏幕適配方案,并分析這幾種方案的優(yōu)劣。
屏幕適配方案 1.1 寬高限定符適配設(shè)定一個基準(zhǔn)的分辨率,也就是設(shè)計(jì)圖對應(yīng)的分辨率,其他分辨率都根據(jù)這個基準(zhǔn)分辨率來計(jì)算,在不同的尺寸文件夾內(nèi)部,根據(jù)該尺寸編寫對應(yīng)的dimens文件。
比如我們的設(shè)計(jì)圖 375 * 667為基準(zhǔn)分辨率
寬度為375,將任何分辨率的寬度整分為375份,取值為x1-x375
高度為667,將任何分辨率的高度整分為667份,取值為y1-y667
那么對于1080*1920的分辨率的dimens文件來說,
x1=(1080/375)*1=2.88px
x2=(1080/375)*2=5.76px
y1=(1920/667)*1=2.87px
y2=(1920/667)*2=5.75px
當(dāng)代碼里面引用高度為y_187,在APP運(yùn)行時會根據(jù)當(dāng)前設(shè)備分辨率去找對應(yīng)xml文件中對應(yīng)的高度,我們就可以按照設(shè)計(jì)稿上的尺寸填寫相對應(yīng)的dimens引用了,這樣基本解決了我們的適配問題,而且極大的提升了我們UI開發(fā)的效率。
驗(yàn)證方案簡單通過計(jì)算驗(yàn)證下這種方案是否能達(dá)到適配的效果,例如設(shè)計(jì)圖上有一個寬187dp的View。
480 * 800
設(shè)計(jì)圖占寬比: 187dp / 375dp = 0.498
實(shí)際在480 800占寬比 = 187 1.28px / 480 = 0.498
1080 * 1920
設(shè)計(jì)圖占寬比: 187dp / 375dp = 0.498
實(shí)際在1080 1920占寬比 = 187 2.88px / 1080 = 0.498
計(jì)算高同理
但是這個方案有一個致命的缺陷,那就是需要精準(zhǔn)命中才能適配,比如1920x1080的手機(jī)就一定要找到1920x1080的限定符,否則就只能用統(tǒng)一的默認(rèn)的dimens文件了。而使用默認(rèn)的尺寸的話,UI就很可能變形,簡單說,就是容錯機(jī)制很差。
1.2 smallestWidth適配smallestWidth適配,或者叫sw限定符適配。指的是Android會識別屏幕可用高度和寬度的最小尺寸的dp值(其實(shí)就是手機(jī)的寬度值),然后根據(jù)識別到的結(jié)果去資源文件中尋找對應(yīng)限定符的文件夾下的資源文件。
這種機(jī)制和上文提到的寬高限定符適配原理上是一樣的,都是系統(tǒng)通過特定的規(guī)則來選擇對應(yīng)的文件。
可以把 smallestWidth 限定符屏幕適配方案 當(dāng)成這種方案的升級版,smallestWidth 限定符屏幕適配方案 只是把 dimens.xml 文件中的值從 px 換成了 dp,原理和使用方式都是沒變的
├── src/main │ ├── res │ ├── ├──values │ ├── ├──values-sw320dp │ ├── ├──values-sw360dp │ ├── ├──values-sw400dp │ ├── ├──values-sw411dp │ ├── ├──values-sw480dp │ ├── ├──... │ ├── ├──values-sw600dp │ ├── ├──values-sw640dp驗(yàn)證方案
1920 * 1080分辨率的手機(jī),dpi為420,我們同樣設(shè)置一個View為187dp寬
density = (dpi = 420) / 160 = 2.6
屏幕總寬度dp = 1080 / density = 415
找到文件夾values-sw410dp下的187dp = 204.45dp
通過公式px = density * dp,計(jì)算出px = 531.57
算出占屏幕寬度的比例,56.86 / 1080 = 0.492
1440 * 2560分辨率的手機(jī),dpi為560,我們同樣設(shè)置一個View為187dp寬
density = (dpi = 420) / 160 = 3.5
屏幕總寬度dp = 1440 / density = 411
找到文件夾values-sw410dp下的187dp = 204.45dp
通過公式px = density * dp,計(jì)算出px = 715.57
算出占屏幕寬度的比例,715.57 / 1440 = 0.496
因?yàn)樽R別的文件夾是values-sw410dp的文件夾,但是屏幕寬度為415dp和411dp,所以最后計(jì)算出的占比會有一點(diǎn)點(diǎn)誤差,基本可以忽略不計(jì),可以達(dá)到相對比較準(zhǔn)確的適配效果
優(yōu)點(diǎn)非常穩(wěn)定,極低概率出現(xiàn)意外
不會有任何性能的損耗
適配范圍可自由控制,不會影響其他三方庫
在插件的配合下,學(xué)習(xí)成本低
缺點(diǎn)侵入性高,在所有地方都需要引用。
還是沒有辦法覆蓋所有的機(jī)型分辨率,部分機(jī)型可能適配效果還是不佳
不能以高度為基準(zhǔn)進(jìn)行適配
生成很多文件,增大APP體積1~2M
1.3 今日頭條適配方案今日頭條屏幕適配方案的核心原理在于,根據(jù)以下公式算出 density
默認(rèn)px = density * dp,也就是屏幕總寬度dp = 屏幕寬度px / density,這個時候我們假設(shè)所有設(shè)備上的屏幕總寬度dp會等于我們設(shè)計(jì)圖375dp,那么可以得出一個公式:
density = 屏幕寬度px / 設(shè)計(jì)圖寬度(375dp)
然后我們通過系統(tǒng)api,將density賦值給系統(tǒng),拋棄掉系統(tǒng)默認(rèn)計(jì)算density的計(jì)算公式。
這樣可以很巧妙的實(shí)現(xiàn)屏幕適配,而且侵入性極低,甚至可以忽略不計(jì)。
驗(yàn)證方案1920 * 1080分辨率的手機(jī),我們同樣設(shè)置一個View為187dp寬,設(shè)計(jì)圖寬度為375dp
density = (屏幕寬度px = 1080) / 375 = 2.88
View寬度 = density * 187dp = 538.56
算出占屏幕寬度的比例,57.6 / 1080 = 0.498
1440 * 2560分辨率的手機(jī),我們同樣設(shè)置一個View為187dp寬,設(shè)計(jì)圖寬度為375dp
density = (屏幕寬度px = 1440) / 375 =3.84
View寬度 = density * 187dp = 718.08
算出占屏幕寬度的比例,718.08 / 1440 = 0.498
可以看出,這種方案是完全沒有誤差的,而且侵入性極低,只需要修改系統(tǒng)的density。雖然修改系統(tǒng)的density屬性會產(chǎn)生一小部分影響,但是基本都是很好解決的。
優(yōu)點(diǎn)使用成本非常低,操作非常簡單
侵入性非常低
可適配三方庫的控件和系統(tǒng)的控件
缺點(diǎn)會全局影響APP的控件大小,例如一些第三方庫控件,他們設(shè)計(jì)的時候可能設(shè)計(jì)圖尺寸并不是像我們一樣是375dp,這樣就會導(dǎo)致控件大小變形等一些問題。
參考文章騷年你的屏幕適配方式該升級了!-SmallestWidth 限定符適配方案
Android 屏幕適配終結(jié)者
Android 目前最穩(wěn)定和高效的UI適配方案
廣而告之本文發(fā)布于薄荷前端周刊,歡迎Watch & Star ★,轉(zhuǎn)載請注明出處。
歡迎討論,點(diǎn)個贊再走吧 ????? ~文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/74423.html
摘要:下圖為圖標(biāo)的各個屏幕密度的對應(yīng)尺寸屏幕密度圖標(biāo)尺寸解析解析獲取屏幕分辨率信息的三種方法第一種第二種第三種屏幕適配出現(xiàn)的原因什么是像素點(diǎn)屏幕分辨率是指在橫縱向上的像素點(diǎn)數(shù),單位是,個像素點(diǎn)。 目錄介紹 1.屏幕適配定義 2.相關(guān)重要的概念 2.1 屏幕尺寸[物理尺寸] 2.2 屏幕分辨率[px] 2.3 屏幕像素密度[dpi] 2.4 dp、dip、dpi、sp、px 2.5 md...
摘要:下圖為圖標(biāo)的各個屏幕密度的對應(yīng)尺寸屏幕密度圖標(biāo)尺寸解析解析獲取屏幕分辨率信息的三種方法第一種第二種第三種屏幕適配出現(xiàn)的原因什么是像素點(diǎn)屏幕分辨率是指在橫縱向上的像素點(diǎn)數(shù),單位是,個像素點(diǎn)。 目錄介紹 1.屏幕適配定義 2.相關(guān)重要的概念 2.1 屏幕尺寸[物理尺寸] 2.2 屏幕分辨率[px] 2.3 屏幕像素密度[dpi] 2.4 dp、dip、dpi、sp、px 2.5 md...
閱讀 1240·2021-11-23 10:10
閱讀 1644·2021-09-30 09:47
閱讀 981·2021-09-27 14:02
閱讀 3042·2019-08-30 15:45
閱讀 3083·2019-08-30 14:11
閱讀 3679·2019-08-29 14:05
閱讀 1879·2019-08-29 13:51
閱讀 2265·2019-08-29 11:33