Android屏幕適配方案總結(jié)

概述

Android系統(tǒng)發(fā)布十多年以來(lái),關(guān)于Android的UI的適配一直是開(kāi)發(fā)中一個(gè)很重要的環(huán)節(jié)胆数,也是一個(gè)很棘手的問(wèn)題刻蚯。

Android適配最核心的問(wèn)題有兩個(gè)谋旦,其一剩失,就是適配的效率,即把設(shè)計(jì)圖轉(zhuǎn)化為App界面的過(guò)程是否高效册着,其二如何保證實(shí)現(xiàn)UI界面在不同尺寸和分辨率的手機(jī)中UI的一致性拴孤。

這兩個(gè)問(wèn)題都很重要,一個(gè)是保證我們開(kāi)發(fā)的高效甲捏,一個(gè)是保證我們適配的成效演熟;今天我們就這兩個(gè)核心的問(wèn)題來(lái)聊一聊Android的適配方案。

PX直接適配

首先司顿,大家都知道芒粹,在標(biāo)識(shí)尺寸的時(shí)候,Android并不推薦我們使用px這個(gè)真實(shí)像素單位大溜,因?yàn)椴煌氖謾C(jī)之間化漆,分辨率是不同的,比如一個(gè)96*96像素的控件在分辨率越來(lái)越高的手機(jī)上會(huì)在整體UI中看起來(lái)越來(lái)越小钦奋。

分辨率依次升高

出現(xiàn)類(lèi)似于上圖這樣這樣座云,整體的布局效果可能會(huì)變形疙赠,所以px這個(gè)單位在布局文件中是不推薦的。

dp直接適配

針對(duì)這種情況朦拖,Android推薦使用dp作為尺寸單位來(lái)適配UI.

那么什么是dp圃阳?

dp指的是設(shè)備獨(dú)立像素,以dp為尺寸單位的控件璧帝,在不同分辨率和尺寸的手機(jī)上代表了不同的真實(shí)像素捍岳,比如在分辨率較低的手機(jī)中,可能1dp=2px,而在分辨率較高的手機(jī)中裸弦,可能1dp=3px祟同,這樣的話,一個(gè)96*96dp的控件理疙,在不同的手機(jī)中就能表現(xiàn)出差不多的大小了晕城。

那么這個(gè)dp是如何計(jì)算的呢? ?

我們都知道一個(gè)公式: px = dp(dpi/160) 系統(tǒng)都是通過(guò)這個(gè)來(lái)判斷px和dp的數(shù)學(xué)關(guān)系窖贤,

那么這里又出現(xiàn)了一個(gè)問(wèn)題砖顷,dpi是什么呢?

dpi是像素密度赃梧,指的是在系統(tǒng)軟件上指定的單位尺寸的像素?cái)?shù)量滤蝠,它往往是寫(xiě)在系統(tǒng)出廠配置文件的一個(gè)固定值。

為什么要強(qiáng)調(diào)它是軟件系統(tǒng)上的概念授嘀?

因?yàn)榇蠹屹I(mǎi)手機(jī)的時(shí)候物咳,往往會(huì)聽(tīng)到另一個(gè)叫ppi的參數(shù),這個(gè)在手機(jī)屏幕中指的也是像素密度蹄皱,但是這個(gè)是物理上的概念览闰,它是客觀存在的不會(huì)改變。dpi是軟件參考了物理像素密度后巷折,人為指定的一個(gè)值压鉴,這樣保證了某一個(gè)區(qū)間內(nèi)的物理像素密度在軟件上都使用同一個(gè)值。這樣會(huì)有利于我們的UI適配锻拘。

比如油吭,幾部相同分辨率不同尺寸的手機(jī)的ppi可能分別是是430,440,450,那么在Android系統(tǒng)中,可能dpi會(huì)全部指定為480.這樣的話署拟,dpi/160就會(huì)是一個(gè)相對(duì)固定的數(shù)值婉宰,這樣就能保證相同分辨率下不同尺寸的手機(jī)表現(xiàn)一致。

而在不同分辨率下推穷,dpi將會(huì)不同芍阎,比如:

根據(jù)上面的表格,我們可以發(fā)現(xiàn)缨恒,720P,和1080P的手機(jī)谴咸,dpi是不同的轮听,這也就意味著,不同的分辨率中岭佳,1dp對(duì)應(yīng)不同數(shù)量的px(720P中血巍,1dp=2px,1080P中1dp=3px)珊随,這就實(shí)現(xiàn)了述寡,當(dāng)我們使用dp來(lái)定義一個(gè)控件大小的時(shí)候,他在不同的手機(jī)里表現(xiàn)出相應(yīng)大小的像素值叶洞。

這種方式存在兩個(gè)小問(wèn)題鲫凶,第一,這只能保證我們寫(xiě)出來(lái)的界面適配絕大部分手機(jī)衩辟,部分手機(jī)仍然需要單獨(dú)適配螟炫,為什么dp只解決了90%的適配問(wèn)題,因?yàn)椴⒉皇撬械?080P的手機(jī)dpi都是480艺晴,比如Google 的Pixel2(1920*1080)的dpi是420昼钻,也就是說(shuō),在Pixel2中封寞,1dp=2.625px,這樣會(huì)導(dǎo)致相同分辨率的手機(jī)中然评,這樣,一個(gè)100dp*100dp的控件狈究,在一般的1080P手機(jī)上碗淌,可能都是300px,而Pixel 2 中 ,就只有262.5px,這樣控件的實(shí)際大小會(huì)有所不同抖锥。

為了更形象的展示亿眠,假設(shè)我們?cè)诓季治募邪岩粋€(gè)ImageView的寬度設(shè)置為360dp,那么在下面兩張圖中表現(xiàn)是不一樣的:

圖一是1080P,480dpi的手機(jī),圖二是1080P,420dpi的手機(jī)

1080P,480dpi的手機(jī)
1080P,420dpi的手機(jī)

從上面的布局中可以看到宁改,同樣是1080P的手機(jī),差異是比較明顯的魂莫。在這種情況下还蹲,我們的UI可能需要做一些微調(diào)甚至單獨(dú)適配。

寬高限定符適配

為了高效的實(shí)現(xiàn)UI開(kāi)發(fā)耙考,出現(xiàn)了新的適配方案谜喊,我把它稱(chēng)作寬高限定符適配。簡(jiǎn)單說(shuō)倦始,就是窮舉市面上所有的Android手機(jī)的寬高像素值:

設(shè)定一個(gè)基準(zhǔn)的分辨率斗遏,其他分辨率都根據(jù)這個(gè)基準(zhǔn)分辨率來(lái)計(jì)算,在不同的尺寸文件夾內(nèi)部鞋邑,根據(jù)該尺寸編寫(xiě)對(duì)應(yīng)的dimens文件诵次。

比如以480x320為基準(zhǔn)分辨率

寬度為320账蓉,將任何分辨率的寬度整分為320份,取值為x1-x320

高度為480逾一,將任何分辨率的高度整分為480份铸本,取值為y1-y480

那么對(duì)于800*480的分辨率的dimens文件來(lái)說(shuō),

x1=(480/320)*1=1.5px

x2=(480/320)*2=3px

......

這個(gè)時(shí)候遵堵,如果我們的UI設(shè)計(jì)界面使用的就是基準(zhǔn)分辨率箱玷,那么我們就可以按照設(shè)計(jì)稿上的尺寸填寫(xiě)相對(duì)應(yīng)的dimens引用了,而當(dāng)APP運(yùn)行在不同分辨率的手機(jī)中時(shí),這些系統(tǒng)會(huì)根據(jù)這些dimens引用去該分辨率的文件夾下面尋找對(duì)應(yīng)的值陌宿。這樣基本解決了我們的適配問(wèn)題锡足,而且極大的提升了我們UI開(kāi)發(fā)的效率。

但是這個(gè)方案有一個(gè)致命的缺陷壳坪,那就是需要精準(zhǔn)命中才能適配舶得,比如1920x1080的手機(jī)就一定要找到1920x1080的限定符,否則就只能用統(tǒng)一的默認(rèn)的dimens文件了弥虐。而使用默認(rèn)的尺寸的話扩灯,UI就很可能變形,簡(jiǎn)單說(shuō)霜瘪,就是容錯(cuò)機(jī)制很差珠插。

smallestWidth 限定符適配方案

我們可以把smallestWidth 限定符屏幕適配方案當(dāng)成寬高限定符方案的升級(jí)版,smallestWidth 限定符屏幕適配方案只是把dimens.xml文件中的值從px換成了dp颖对,原理和使用方式都是沒(méi)變的捻撑,這些在上面的文章中都有介紹,下面就直接開(kāi)始剖析原理缤底,smallestWidth 限定符屏幕適配方案長(zhǎng)這樣


什么是 smallestWidth

smallestWidth翻譯為中文的意思就是最小寬度顾患,那這個(gè)最小寬度是什么意思呢?

系統(tǒng)會(huì)根據(jù)當(dāng)前設(shè)備屏幕的最小寬度來(lái)匹配values-sw<N>dp个唧,為什么不是根據(jù)寬度來(lái)匹配江解,而要加上最小這兩個(gè)字呢?

這就要說(shuō)到徙歼,移動(dòng)設(shè)備都是允許屏幕可以旋轉(zhuǎn)的犁河,當(dāng)屏幕旋轉(zhuǎn)時(shí),屏幕的高寬就會(huì)互換魄梯,加上最小這兩個(gè)字桨螺,是因?yàn)檫@個(gè)方案是不區(qū)分屏幕方向的,它只會(huì)把屏幕的高度和寬度中值最小的一方認(rèn)為是最小寬度酿秸,這個(gè)最小寬度是根據(jù)屏幕來(lái)定的灭翔,是固定不變的,意思是不管您怎么旋轉(zhuǎn)屏幕辣苏,只要這個(gè)屏幕的高度大于寬度肝箱,那系統(tǒng)就只會(huì)認(rèn)定寬度的值為最小寬度哄褒,反之如果屏幕的寬度大于高度,那系統(tǒng)就會(huì)認(rèn)定屏幕的高度的值為最小寬度

如果想讓屏幕寬度隨著屏幕的旋轉(zhuǎn)而做出改變?cè)撛趺崔k呢狭园?可以再根據(jù)values-w<N>dp(去掉sw中的s) 生成一套資源文件

如果想?yún)^(qū)分屏幕的方向來(lái)做適配該怎么辦呢读处?那就只有再根據(jù)屏幕方向限定符生成一套資源文件咯,后綴加上-land-port即可唱矛,像這樣罚舱,values-sw400dp-land (最小寬度 400 dp 橫向)values-sw400dp-port (最小寬度 400 dp 縱向)绎谦。

原理

其實(shí)smallestWidth 限定符屏幕適配方案的原理也很簡(jiǎn)單管闷,開(kāi)發(fā)者先在項(xiàng)目中根據(jù)主流屏幕的最小寬度 (smallestWidth)生成一系列values-sw<N>dp文件夾 (含有dimens.xml文件),當(dāng)把項(xiàng)目運(yùn)行到設(shè)備上時(shí)窃肠,系統(tǒng)會(huì)根據(jù)當(dāng)前設(shè)備屏幕的最小寬度 (smallestWidth)去匹配對(duì)應(yīng)的values-sw<N>dp文件夾包个,而對(duì)應(yīng)的values-sw<N>dp文件夾中的dimens.xml文字中的值,又是根據(jù)當(dāng)前設(shè)備屏幕的最小寬度 (smallestWidth)而定制的冤留,所以一定能適配當(dāng)前設(shè)備碧囊。

如果系統(tǒng)根據(jù)當(dāng)前設(shè)備屏幕的最小寬度 (smallestWidth)沒(méi)找到對(duì)應(yīng)的values-sw<N>dp文件夾,則會(huì)去尋找與之最小寬度 (smallestWidth)相近的values-sw<N>dp文件夾纤怒,系統(tǒng)只會(huì)尋找小于或等于當(dāng)前設(shè)備最小寬度 (smallestWidth)values-sw<N>dp糯而,這就是優(yōu)于寬高限定符屏幕適配方案的容錯(cuò)率,并且也可以少生成很多values-sw<N>dp文件夾泊窘,減輕App的體積熄驼。

smallestWidth 的值是怎么算的

要先算出當(dāng)前設(shè)備的smallestWidth值我們才能知道當(dāng)前設(shè)備該匹配哪個(gè)values-sw<N>dp文件夾

現(xiàn)在來(lái)舉栗:

我們假設(shè)設(shè)備的屏幕信息是1920 * 1080480 dpi

根據(jù)上面的規(guī)則我們要在屏幕的高度和寬度中選擇值最小的一方作為最小寬度烘豹,1080 < 1920瓜贾,明顯1080 px就是我們要找的最小寬度的值,但最小寬度的單位是dp携悯,所以我們要把px轉(zhuǎn)換為dp

幫助大家再鞏固下基礎(chǔ)祭芦,下面的公式一定不能再忘了!

px / density = dp憔鬼,DPI / 160 = density龟劲,所以最終的公式是px / (DPI / 160) = dp

所以我們得到的最小寬度的值是360 dp (1080 / (480 / 160) = 360)

現(xiàn)在我們已經(jīng)算出了當(dāng)前設(shè)備的最小寬度是360 dp,我們曉得系統(tǒng)會(huì)根據(jù)這個(gè)最小寬度幫助我們匹配到values-sw360dp文件夾下的dimens.xml文件逊彭,如果項(xiàng)目中沒(méi)有values-sw360dp這個(gè)文件夾咸灿,系統(tǒng)才會(huì)去匹配相近的values-sw<N>dp文件夾

dimens.xml文件是整個(gè)方案的核心所在构订,所以接下來(lái)我們?cè)賮?lái)看看values-sw360dp文件夾中的這個(gè)dimens.xml是根據(jù)什么原理生成的

dimens.xml 生成原理

dimens.xml?的生成侮叮,就要涉及到兩個(gè)因數(shù),第一個(gè)因素是?最小寬度基準(zhǔn)值悼瘾,第二個(gè)因素就是您的項(xiàng)目需要適配哪些?最小寬度囊榜,通俗理解就是需要生成多少個(gè)?values-sw<N>dp?文件夾审胸。

第一個(gè)因素

最小寬度基準(zhǔn)值是什么意思呢?簡(jiǎn)單理解就是您需要把設(shè)備的屏幕寬度分為多少份卸勺,假設(shè)我們現(xiàn)在把項(xiàng)目的最小寬度基準(zhǔn)值定為360砂沛,那這個(gè)方案就會(huì)理解為您想把所有設(shè)備的屏幕寬度都分為360份,方案會(huì)幫您在dimens.xml文件中生成1360dimens引用曙求,比如values-sw360dp中的dimens.xml是長(zhǎng)這樣的

values-sw360dp指的是當(dāng)前設(shè)備屏幕的最小寬度360dp(該設(shè)備高度大于寬度碍庵,則最小寬度就是寬度,所以該設(shè)備寬度為360dp)悟狱,把屏幕寬度分為360份静浴,剛好每份等于1dp,所以每個(gè)引用都遞增1dp挤渐,值最大的dimens引用dp_360值也是360dp苹享,剛好覆蓋屏幕寬度

下面再來(lái)看看將最小寬度基準(zhǔn)值定為360時(shí),values-sw400dp中的dimens.xml長(zhǎng)什么樣

values-sw400dp指的是當(dāng)前設(shè)備屏幕的最小寬度400dp(該設(shè)備高度大于寬度浴麻,則最小寬度就是寬度得问,所以該設(shè)備寬度為400dp),把屏幕寬度同樣分為360份软免,這時(shí)每份就等于1.1111dp了宫纬,每個(gè)引用都遞增1.1111dp,值最大的dimens引用dp_360同樣剛好覆蓋屏幕寬度或杠,為400dp哪怔。

第二個(gè)因素

第二個(gè)因數(shù)是需要適配哪些最小寬度?比如我們想適配的最小寬度320dp向抢、360dp认境、400dp411dp挟鸠、480dp叉信,那方案就會(huì)為您的項(xiàng)目生成values-sw320dpvalues-sw360dp艘希、values-sw400dp硼身、values-sw411dpvalues-sw480dp這幾個(gè)資源文件夾覆享,像這樣

方案會(huì)為我們需要適配的最小寬度佳遂,在項(xiàng)目中生成一系列對(duì)應(yīng)的values-sw<N>dp,在前面也說(shuō)了撒顿,如果某個(gè)設(shè)備沒(méi)有為它提供對(duì)應(yīng)的values-sw<N>dp丑罪,那它就會(huì)去尋找相近的values-sw<N>dp,但如果這個(gè)相近的values-sw<N>dp與期望的values-sw<N>dp差距太大,那適配效果也就會(huì)大打折扣吩屹。

理論上values-sw<N>dp?文件夾生成的越多越好跪另,但也不實(shí)際,因?yàn)闀?huì)增加apk的體積煤搜,這里建議以10個(gè)單位為步長(zhǎng)免绿。

優(yōu)點(diǎn)

非常穩(wěn)定,極低概率出現(xiàn)意外

不會(huì)有任何性能的損耗

適配范圍可自由控制擦盾,不會(huì)影響其他三方庫(kù)

在插件的配合下嘲驾,學(xué)習(xí)成本低

缺點(diǎn)

在布局中引用dimens的方式,雖然學(xué)習(xí)成本低迹卢,但是在日常維護(hù)修改時(shí)較麻煩

侵入性高距淫,如果項(xiàng)目想切換為其他屏幕適配方案,因?yàn)槊總€(gè)Layout文件中都存在有大量dimens的引用婶希,這時(shí)修改起來(lái)工作量非常巨大榕暇,切換成本非常高昂

無(wú)法覆蓋全部機(jī)型,想覆蓋更多機(jī)型的做法就是生成更多的資源文件喻杈,但這樣會(huì)增加App體積彤枢,在沒(méi)有覆蓋的機(jī)型上還會(huì)出現(xiàn)一定的誤差,所以有時(shí)需要在適配效果和占用空間上做一些抉擇

不能自動(dòng)支持橫豎屏切換時(shí)的適配筒饰,如上文所說(shuō)缴啡,如果想自動(dòng)支持橫豎屏切換時(shí)的適配,需要使用values-w<N>dp屏幕方向限定符再生成一套資源文件瓷们,這樣又會(huì)再次增加App的體積

最小寬度限定符適配(項(xiàng)目地址)

今日頭條屏幕適配方案

原理

今日頭條屏幕適配方案的核心原理在于計(jì)算density的方式不同业栅,根據(jù)以下公式算出?density

當(dāng)前設(shè)備屏幕總寬度(單位為像素)/ 設(shè)計(jì)圖總寬度(單位為 dp) = density

density?的意思就是?1 dp?占當(dāng)前設(shè)備多少像素

為什么要算出?density,這和屏幕適配有什么關(guān)系呢谬晕?

大家都知道碘裕,不管你在布局文件中填寫(xiě)的是什么單位,最后都會(huì)被轉(zhuǎn)化為px攒钳,系統(tǒng)就是通過(guò)上面的方法帮孔,將你在項(xiàng)目中任何地方填寫(xiě)的單位都轉(zhuǎn)換為px的。

所以我們常用的px轉(zhuǎn)dp的公式dp = px / density不撑,就是根據(jù)上面的方法得來(lái)的文兢,density在公式的運(yùn)算中扮演著至關(guān)重要的一步。

我們還得明白一點(diǎn)焕檬,今日頭條適配方案也是只能以高或?qū)捴械囊粋€(gè)作為基準(zhǔn)姆坚,進(jìn)行適配,那為什么不能实愚,高以高為基準(zhǔn)兼呵,寬以寬為基準(zhǔn)烹俗,同時(shí)進(jìn)行適配呢?

這是因?yàn)榇蟛糠质忻嫔系?Android?設(shè)備的屏幕高寬比都不一致萍程,特別是現(xiàn)在大量全面屏的問(wèn)世,這個(gè)問(wèn)題更加嚴(yán)重兔仰,不同廠商推出的全面屏手機(jī)的屏幕高寬比都可能不一致茫负,這時(shí)我們只以高或?qū)捚渲械囊粋€(gè)作為基準(zhǔn)進(jìn)行適配,就會(huì)有效的避免布局在高寬比不一致的屏幕上出現(xiàn)變形的問(wèn)題乎赴。

我再來(lái)說(shuō)說(shuō)density忍法,density在每個(gè)設(shè)備上都是固定的,DPI / 160 = density榕吼,屏幕的總 px 寬度 / density = 屏幕的總 dp 寬度

設(shè)備 1饿序,屏幕寬度為1080px480DPI羹蚣,屏幕總dp寬度為1080 / (480 / 160) = 360dp

設(shè)備 2原探,屏幕寬度為1440560DPI顽素,屏幕總dp寬度為1440 / (560 / 160) = 411dp

可以看到屏幕的總dp寬度在不同的設(shè)備上是會(huì)變化的咽弦,但是我們?cè)诓季种刑顚?xiě)的dp值卻是固定不變的。

那我們能怎么辦呢胁出?

我們要想完美適配型型,那就必須保證這個(gè)?View?在任何分辨率的屏幕上,與屏幕的比例都是相同的

這時(shí)今日頭條的方案就該出場(chǎng)了全蝶,我們都知道:

屏幕的總 px 寬度 / density = 屏幕的總 dp 寬度

DPI / 160 = density

而今日頭條的公式是:

當(dāng)前設(shè)備屏幕總寬度(單位為px)/ 設(shè)計(jì)圖總寬度(單位為 dp) = density

只要?density?根據(jù)不同的設(shè)備進(jìn)行實(shí)時(shí)計(jì)算并作出改變闹蒜,就能保證?設(shè)計(jì)圖總寬度?不變,也就完成了適配抑淫。

density修改的一段源碼

驗(yàn)證方案可行性

假設(shè)設(shè)計(jì)圖總寬度為375 dp绷落,一個(gè)View在這個(gè)設(shè)計(jì)圖上的尺寸是50dp * 50dp,這個(gè)View的寬度占整個(gè)設(shè)計(jì)圖寬度的13.3%(50 / 375 = 0.133)始苇,那我們就來(lái)驗(yàn)證下在使用今日頭條屏幕適配方案的情況下嘱函,這個(gè)View與屏幕寬度的比例在分辨率不同的設(shè)備上是否還能保持和設(shè)計(jì)圖中的比例一致。

驗(yàn)證設(shè)備 1

屏幕總寬度為1080 px埂蕊,根據(jù)今日頭條的的公式求出density往弓,1080 / 375 = 2.88 (density)

這個(gè)50dp * 50dpView,系統(tǒng)最后會(huì)將高寬都換算成px蓄氧,50dp * 2.88 = 144 px(根據(jù)公式dp * density = px)

144 / 1080 = 0.133函似,View實(shí)際寬度與屏幕總寬度的比例和View在設(shè)計(jì)圖中的比例一致 (50 / 375 = 0.133),所以完成了等比例縮放

某些設(shè)備總寬度為1080 px喉童,但是DPI可能不同撇寞,是否會(huì)對(duì)今日頭條適配方案產(chǎn)生影響?其實(shí)這個(gè)方案根本沒(méi)有根據(jù)DPI求出density,是根據(jù)自己的公式求出的density蔑担,所以這對(duì)今日頭條的方案沒(méi)有影響

上面只能確定在所有屏幕總寬度為1080 px的設(shè)備上能完成等比例適配牌废,那我們?cè)賮?lái)試試其他分辨率的設(shè)備

驗(yàn)證設(shè)備 2

屏幕總寬度為1440 px,根據(jù)今日頭條的的公式求出density啤握,1440 / 375 = 3.84 (density)

這個(gè)50dp * 50dpView鸟缕,系統(tǒng)最后會(huì)將高寬都換算成px50dp * 3.84 = 192 px(根據(jù)公式dp * density = px)

192 / 1440 = 0.133排抬,View實(shí)際寬度與屏幕總寬度的比例和View在設(shè)計(jì)圖中的比例一致 (50 / 375 = 0.133)懂从,所以也完成了等比例縮放

優(yōu)點(diǎn)

使用成本非常低,操作非常簡(jiǎn)單蹲蒲,使用該方案后在頁(yè)面布局時(shí)不需要額外的代碼和操作番甩,這點(diǎn)可以說(shuō)完虐其他屏幕適配方案

侵入性非常低,該方案和項(xiàng)目完全解耦届搁,在項(xiàng)目布局時(shí)不會(huì)依賴(lài)哪怕一行該方案的代碼缘薛,而且使用的還是Android官方的API,意味著當(dāng)你遇到什么問(wèn)題無(wú)法解決卡睦,想切換為其他屏幕適配方案時(shí)掩宜,基本不需要更改之前的代碼,整個(gè)切換過(guò)程幾乎在瞬間完成么翰,會(huì)少很多麻煩牺汤,節(jié)約很多時(shí)間,試錯(cuò)成本接近于 0

可適配三方庫(kù)的控件和系統(tǒng)的控件(不止是ActivityFragment浩嫌,Dialog檐迟、Toast等所有系統(tǒng)控件都可以適配),由于修改的density在整個(gè)項(xiàng)目中是全局的码耐,所以只要一次修改追迟,項(xiàng)目中的所有地方都會(huì)受益

不會(huì)有任何性能的損耗

缺點(diǎn)

暫時(shí)沒(méi)發(fā)現(xiàn)其他什么很明顯的缺點(diǎn),已知的缺點(diǎn)有一個(gè)骚腥,那就是第三個(gè)優(yōu)點(diǎn)敦间,它既是這個(gè)方案的優(yōu)點(diǎn)也同樣是缺點(diǎn),但是就這一個(gè)缺點(diǎn)也是非常致命的

只需要修改一次density束铭,項(xiàng)目中的所有地方都會(huì)自動(dòng)適配廓块,這個(gè)看似解放了雙手,減少了很多操作契沫,但是實(shí)際上反應(yīng)了一個(gè)缺點(diǎn)带猴,那就是只能一刀切的將整個(gè)項(xiàng)目進(jìn)行適配,但適配范圍是不可控的

這樣不是很好嗎懈万?這樣本來(lái)是很好的拴清,但是應(yīng)用到這個(gè)方案是就不好了靶病,因?yàn)槲疑厦娴脑硪卜治隽耍@個(gè)方案依賴(lài)于設(shè)計(jì)圖尺寸口予,但是項(xiàng)目中的系統(tǒng)控件娄周、三方庫(kù)控件、等非我們項(xiàng)目自身設(shè)計(jì)的控件沪停,它們的設(shè)計(jì)圖尺寸并不會(huì)和我們項(xiàng)目自身的設(shè)計(jì)圖尺寸一樣

當(dāng)這個(gè)適配方案不分類(lèi)型煤辨,將所有控件都強(qiáng)行使用我們項(xiàng)目自身的設(shè)計(jì)圖尺寸進(jìn)行適配時(shí),這時(shí)就會(huì)出現(xiàn)問(wèn)題牙甫,當(dāng)某個(gè)系統(tǒng)控件或三方庫(kù)控件的設(shè)計(jì)圖尺寸和我們項(xiàng)目自身的設(shè)計(jì)圖尺寸差距非常大時(shí),這個(gè)問(wèn)題就越嚴(yán)重

AndroidAutoSize(項(xiàng)目地址)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末调违,一起剝皮案震驚了整個(gè)濱河市窟哺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌技肩,老刑警劉巖且轨,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虚婿,居然都是意外死亡旋奢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)然痊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)至朗,“玉大人,你說(shuō)我怎么就攤上這事剧浸∏乱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵唆香,是天一觀的道長(zhǎng)嫌变。 經(jīng)常有香客問(wèn)我,道長(zhǎng)躬它,這世上最難降的妖魔是什么腾啥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮冯吓,結(jié)果婚禮上倘待,老公的妹妹穿的比我還像新娘。我一直安慰自己组贺,他們只是感情好延柠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著锣披,像睡著了一般贞间。 火紅的嫁衣襯著肌膚如雪贿条。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天增热,我揣著相機(jī)與錄音整以,去河邊找鬼。 笑死峻仇,一個(gè)胖子當(dāng)著我的面吹牛公黑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摄咆,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凡蚜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吭从?” 一聲冷哼從身側(cè)響起朝蜘,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涩金,沒(méi)想到半個(gè)月后谱醇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡步做,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年副渴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全度。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煮剧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出将鸵,到底是詐尸還是另有隱情轿秧,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布咨堤,位于F島的核電站菇篡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏一喘。R本人自食惡果不足惜驱还,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凸克。 院中可真熱鬧议蟆,春花似錦、人聲如沸萎战。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蚂维。三九已至戳粒,卻和暖如春路狮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔚约。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工奄妨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苹祟。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓砸抛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親树枫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子直焙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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