之前兩篇把屏幕適配概念梳理了還講解了dp適配方案、寬高限定符適配方案,還沒有看過的童鞋可以先參考這兩篇:
Android全面的屏幕適配方案解析(一)__屏幕適配概念梳理
Android全面的屏幕適配方案解析(二)__寬高限定符屏幕適配
Android全面的屏幕適配方案解析(三)__sw限定符適配方案
Android全面的屏幕適配方案解析(四)__今日頭條適配方案
下面列舉常用的適配方案:
- dp適配方案
- 寬高限定符適配方案
- AndroidAutoLayout適配方案
- sw限定符適配方案
- 今日頭條適配方案
- AndroidAutoSize適配方案
這里還是有必要重申一下频祝,有些過時(shí)的適配方案這里還講解啊厕倍,只能說每種適配方案都會(huì)有各自的優(yōu)缺點(diǎn)卓起,從最原始的適配方案講起,才能更好的理解為啥會(huì)衍生出各種適配方案视粮,話不多說,下面繼續(xù)講解橙凳。
3蕾殴、AndroidAutoLayout適配方案
所謂的AndroidAutoLayout適配方案笑撞,其實(shí)就是UI適配框架,這個(gè)是鴻洋大佬寫的適配方案钓觉,這也是受寬高限定符適配方案啟發(fā)寫的茴肥,使用方式也比較簡(jiǎn)單,直接填寫設(shè)計(jì)圖上的像素尺寸即可完成適配荡灾,不過目前這個(gè)框架已停止維護(hù)瓤狐。
下面還是根據(jù)實(shí)例來講解集成過程:
1、引入該適配框架
implementation 'com.zhy:autolayout:1.4.5'
2批幌、在項(xiàng)目中的AndroidManifest配置文件注明設(shè)計(jì)稿的尺寸础锐,這里測(cè)試以720x1280為例:
<!-- 測(cè)試手機(jī)的尺寸 -->
<meta-data
android:name="design_width"
android:value="720" />
<meta-data
android:name="design_height"
android:value="1280" />
3、將需要適配的Activity繼承自AutoLayoutActivity荧缘,如果你不希望繼承AutoLayoutActivity郁稍,可以在編寫布局文件時(shí),將:
- LinearLayout -> AutoLinearLayout
- RelativeLayout -> AutoRelativeLayout
- FrameLayout -> AutoFrameLayout
這樣也可以完成適配胜宇,我這里測(cè)試實(shí)例使用AutoRelativeLayout進(jìn)行測(cè)試耀怜,測(cè)試布局如下:
<?xml version="1.0" encoding="utf-8"?>
<com.zhy.autolayout.AutoRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:layout_width="250px"
android:layout_height="250px"
android:layout_centerInParent="true"
android:src="@mipmap/ic_launcher" />
</com.zhy.autolayout.AutoRelativeLayout>
測(cè)試布局文件非常的簡(jiǎn)單,只設(shè)置了圖片桐愉,細(xì)心的童鞋也發(fā)現(xiàn)了财破,這里圖片的寬高都是設(shè)置以px為單位,而不是我們常用的dp為單位从诲,如圖所示:
是的左痢,你沒有看錯(cuò),這里可以直接在布局文件里面使用具體的像素值系洛,例如設(shè)計(jì)稿上標(biāo)注的圖片是250*250俊性,那么我們可以直接寫250px,運(yùn)行時(shí)框架會(huì)幫助我們根據(jù)不同手機(jī)的具體尺寸按比例伸縮描扯,我們來看看這個(gè)實(shí)例在不同手機(jī)的測(cè)試對(duì)比效果圖:
我們?cè)賮砜匆幌聸]有使用AndroidAutoLayout適配方案之前不同手機(jī)的測(cè)試對(duì)比效果:
根據(jù)適配前后的對(duì)比效果還是挺明顯的定页,我這里主要介紹的是基本的適配方案,如果你想了解更詳細(xì)的適配方式绽诚,可以到這里點(diǎn)擊這里
毫無疑問典徊,這個(gè)UI框架是個(gè)極好的適配方案,使用簡(jiǎn)單恩够,所要做的就是抄抄設(shè)計(jì)稿上面的px卒落,直接寫入布局文件即可完成適配,而且在寬高限定符適配方案的基礎(chǔ)上更近一步蜂桶,完美解決了容錯(cuò)機(jī)制的問題儡毕,讓開發(fā)更加的高效。
那這個(gè)方案有沒缺點(diǎn)呢扑媚?
當(dāng)然也是有的腰湾,首先是這個(gè)UI適配框架已經(jīng)停止適配贾费,這也意味著一旦這個(gè)框架在使用過程中遇到難以解決的問題,替換起來會(huì)非常的麻煩且耗精力檐盟,當(dāng)然如果你已經(jīng)熟悉了這套源碼除外哈褂萧。
4、sw限定符適配方案
sw限定符適配即smallestWidth適配葵萎,也叫最小寬度限定符適配导犹,指的是Android會(huì)識(shí)別到屏幕可用高度或?qū)挾鹊淖钚〕叽绲膁p值,對(duì)于手機(jī)來說羡忘,這個(gè)值其實(shí)就是手機(jī)的寬度值谎痢,而對(duì)于平板來說,這個(gè)值就是平板的高度值卷雕。然后根據(jù)識(shí)別到的結(jié)果去資源文件中尋找對(duì)應(yīng)限定符文件夾下的資源文件节猿。其實(shí)這種適配方案跟之前介紹的寬高限定符適配方案原理是一樣一樣的,都是系統(tǒng)通過特定的規(guī)則來找到對(duì)應(yīng)的資源文件漫雕。
我們先來看一下資源文件滨嘱,這份是通過插件生成的以375dp為基準(zhǔn)的資源文件,插件的使用后面會(huì)介紹浸间,如圖所示:
舉例說明:比如我有臺(tái)測(cè)試機(jī)為小米太雨,手機(jī)分辨率為1080x1920,屏幕像素密度為480魁蒜,根據(jù)最小寬度限定符適配方案囊扳,該手機(jī)最小寬度為1080px,再根據(jù)px=dp(dpi/160)兜看,橫向的dp值是1080/(480/160)锥咸,也就是360dp,根據(jù)這個(gè)結(jié)果系統(tǒng)就會(huì)去資源文件中尋找values-sw360dp文件夾下的資源文件细移,如圖所示:
前面說了搏予,該方案的原理跟寬高限定符適配方案是一樣的,所以也需要提前設(shè)置基準(zhǔn)尺寸葫哗,比如我這里以375dp為基準(zhǔn)缔刹,即將任何分辨率的寬度分為375份,我們來看看基準(zhǔn)資源文件劣针,如圖所示:
我們?cè)倌蒙厦嫘∶资謾C(jī)舉例說明,我們來看看values-sw360dp文件夾下的資源文件亿扁,如圖所示:
那么這份數(shù)據(jù)是怎么計(jì)算得到的呢捺典,當(dāng)然也是在基準(zhǔn)尺寸的基礎(chǔ)上計(jì)算得到的,即:
dp_1=(360/基準(zhǔn))1=(360/375)1=0.96dp
dp_2=(360/基準(zhǔn))2=(360/375)2=1.92dp
...
dp_375=(360/基準(zhǔn))375=(360/375)375=360dp
其它手機(jī)尺寸也是同理這樣計(jì)算得到的从祝。
那下面來看看資源文件是怎么生成的襟己?
實(shí)現(xiàn)步驟:
1引谜、在Android studio中安裝ScreenMatch插件
點(diǎn)擊菜單欄上的 File -> Settings -> Plugins ,搜索ScreenMatch關(guān)鍵字擎浴,安裝插件员咽,安裝成功后,點(diǎn)擊 “OK”贮预,重啟 Andorid Studio 即可贝室,如圖所示:
2、在項(xiàng)目values文件夾下需要一份dimens.xml文件仿吞,即前面說的默認(rèn)基準(zhǔn)尺寸文件滑频,如圖所示:
3、插件安裝后唤冈,在項(xiàng)目的任意目錄或文件上右鍵峡迷,選擇 ScreenMatch 選項(xiàng),如圖所示:
4你虹、然后選擇需要適配的module 绘搞,我這里測(cè)試只有一個(gè),如圖所示:
5傅物、點(diǎn)擊 OK后 看杭,出現(xiàn)如下彈窗即表示生成資源文件成功,如圖所示:
通過以上的步驟res 目錄下就生成了默認(rèn)尺寸的所有資源文件啦挟伙。
上面步驟是以最小寬度基準(zhǔn)值為375dp楼雹,適配的設(shè)備最小寬度為:240,320,384,392,400,410,411,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365生成的文件,當(dāng)然實(shí)際開發(fā)需要根據(jù)設(shè)計(jì)圖需求進(jìn)行設(shè)置尖阔,這個(gè)時(shí)候就需要更改基準(zhǔn)值及需要適配的適配啦贮缅,那下面看看怎么更改的。
例如現(xiàn)在UI的設(shè)計(jì)圖最小寬度為360dp介却,則需要更改最小寬度基準(zhǔn)值為 360dp谴供。假如我們需要適配的設(shè)備最小寬度保留 320,360,384,392,400,410,411,480即可,如果還需要添加其他最小寬度的設(shè)備自行加上即可齿坷,首先我們需要找到插件的screenMatch.properties配置文件并打開桂肌,如圖所示:
然后我們需要在配置文件修改,修改下圖中 1永淌、3崎场、4處的值即可,如圖所示:
值得注意的是上圖設(shè)置的值單位都為dp遂蛀。
我們?cè)賮砜纯?谭跨、2、3、4表示什么意思:
1螃宙、表示最小寬度基準(zhǔn)值蛮瞄,填寫設(shè)計(jì)圖的最小寬度值即可。
2谆扎、表示插件默認(rèn)適配的最小寬度值挂捅,即默認(rèn)情況下會(huì)生成如下值的 dimens.xml 文件。
3堂湖、表示需要適配的最小寬度值闲先,即你想生成哪些 dimens.xml 文件。
4苗缩、忽略不需要適配的最小寬度值饵蒂,即忽略掉插件默認(rèn)生成的 dimens.xml 文件。
修改完配置文件后酱讶,重新執(zhí)行步驟3就會(huì)生成新的資源文件退盯。
我們?cè)賮砜匆幌聅w限定符適配方案的優(yōu)點(diǎn):
sw限定符適配方案和寬高限定符適配方案最大的區(qū)別在于:前者有很好的容錯(cuò)機(jī)制,如果沒有value-sw360dp文件夾泻肯,系統(tǒng)會(huì)向下尋找渊迁,比如離360dp最近的只有value-sw350dp,那么Android就會(huì)選擇value-sw350dp文件夾下面的資源文件灶挟。這個(gè)特性就完美的解決了寬高限定符適配方案的容錯(cuò)問題琉朽。而且sw限定符適配方案非常穩(wěn)定,極低概率出現(xiàn)意外稚铣。在插件的配合下箱叁,學(xué)習(xí)成本也比較低。
那這種方案有沒缺點(diǎn)呢惕医?當(dāng)然也是有的
- 最明顯的肯定也是占用資源大耕漱,會(huì)增加APK的體積
- 在布局中引用dimens的方式,在維護(hù)過程中修改會(huì)比較麻煩抬伺。
- 侵入性高螟够,比如想切換其它適配方案,由于每個(gè)layout文件中有大量的dimens引用峡钓,修改起來工作量會(huì)非常巨大妓笙,切換成本非常高。
為了防止篇幅過長(zhǎng)能岩,這里就先介紹這兩種適配方案寞宫,后面幾種后面會(huì)一一解析,敬請(qǐng)期待捧灰。歡迎關(guān)注公眾號(hào)【龍旋】能獲取最新更新內(nèi)容哦淆九。