之前兩篇把屏幕適配概念梳理了還講解了dp適配方案、寬高限定符適配方案,還沒有看過的童鞋可以先參考這兩篇:
Android全面的屏幕適配方案解析(一)__屏幕適配概念梳理
Android全面的屏幕適配方案解析(二)__寬高限定符屏幕適配
Android全面的屏幕適配方案解析(三)__sw限定符適配方案
Android全面的屏幕適配方案解析(四)__今日頭條適配方案
下面列舉常用的適配方案:
- dp適配方案
- 寬高限定符適配方案
- AndroidAutoLayout適配方案
- sw限定符適配方案
- 今日頭條適配方案
- AndroidAutoSize適配方案
這裏還是有必要重申一下,有些過時的適配方案這裏還講解啊,只能說每種適配方案都會有各自的優缺點,從最原始的適配方案講起,才能更好的理解爲啥會衍生出各種適配方案,話不多說,下面繼續講解。
3、AndroidAutoLayout適配方案
所謂的AndroidAutoLayout適配方案,其實就是UI適配框架,這個是鴻洋大佬寫的適配方案,這也是受寬高限定符適配方案啓發寫的,使用方式也比較簡單,直接填寫設計圖上的像素尺寸即可完成適配,不過目前這個框架已停止維護。
下面還是根據實例來講解集成過程:
1、引入該適配框架
implementation 'com.zhy:autolayout:1.4.5'
2、在項目中的AndroidManifest配置文件註明設計稿的尺寸,這裏測試以720x1280爲例:
<!-- 測試手機的尺寸 -->
<meta-data
android:name="design_width"
android:value="720" />
<meta-data
android:name="design_height"
android:value="1280" />
3、將需要適配的Activity繼承自AutoLayoutActivity,如果你不希望繼承AutoLayoutActivity,可以在編寫佈局文件時,將:
- LinearLayout -> AutoLinearLayout
- RelativeLayout -> AutoRelativeLayout
- FrameLayout -> AutoFrameLayout
這樣也可以完成適配,我這裏測試實例使用AutoRelativeLayout進行測試,測試佈局如下:
<?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>
測試佈局文件非常的簡單,只設置了圖片,細心的童鞋也發現了,這裏圖片的寬高都是設置以px爲單位,而不是我們常用的dp爲單位,如圖所示:
是的,你沒有看錯,這裏可以直接在佈局文件裏面使用具體的像素值,例如設計稿上標註的圖片是250*250,那麼我們可以直接寫250px,運行時框架會幫助我們根據不同手機的具體尺寸按比例伸縮,我們來看看這個實例在不同手機的測試對比效果圖:
我們再來看一下沒有使用AndroidAutoLayout適配方案之前不同手機的測試對比效果:
根據適配前後的對比效果還是挺明顯的,我這裏主要介紹的是基本的適配方案,如果你想了解更詳細的適配方式,可以到這裏點擊這裏
毫無疑問,這個UI框架是個極好的適配方案,使用簡單,所要做的就是抄抄設計稿上面的px,直接寫入佈局文件即可完成適配,而且在寬高限定符適配方案的基礎上更近一步,完美解決了容錯機制的問題,讓開發更加的高效。
那這個方案有沒缺點呢?
當然也是有的,首先是這個UI適配框架已經停止適配,這也意味着一旦這個框架在使用過程中遇到難以解決的問題,替換起來會非常的麻煩且耗精力,當然如果你已經熟悉了這套源碼除外哈。
4、sw限定符適配方案
sw限定符適配即smallestWidth適配,也叫最小寬度限定符適配,指的是Android會識別到屏幕可用高度或寬度的最小尺寸的dp值,對於手機來說,這個值其實就是手機的寬度值,而對於平板來說,這個值就是平板的高度值。然後根據識別到的結果去資源文件中尋找對應限定符文件夾下的資源文件。其實這種適配方案跟之前介紹的寬高限定符適配方案原理是一樣一樣的,都是系統通過特定的規則來找到對應的資源文件。
我們先來看一下資源文件,這份是通過插件生成的以375dp爲基準的資源文件,插件的使用後面會介紹,如圖所示:
舉例說明:比如我有臺測試機爲小米,手機分辨率爲1080x1920,屏幕像素密度爲480,根據最小寬度限定符適配方案,該手機最小寬度爲1080px,再根據px=dp(dpi/160),橫向的dp值是1080/(480/160),也就是360dp,根據這個結果系統就會去資源文件中尋找values-sw360dp文件夾下的資源文件,如圖所示:
前面說了,該方案的原理跟寬高限定符適配方案是一樣的,所以也需要提前設置基準尺寸,比如我這裏以375dp爲基準,即將任何分辨率的寬度分爲375份,我們來看看基準資源文件,如圖所示:
我們再拿上面小米手機舉例說明,我們來看看values-sw360dp文件夾下的資源文件,如圖所示:
那麼這份數據是怎麼計算得到的呢,當然也是在基準尺寸的基礎上計算得到的,即:
dp_1=(360/基準)1=(360/375)1=0.96dp
dp_2=(360/基準)2=(360/375)2=1.92dp
...
dp_375=(360/基準)375=(360/375)375=360dp
其它手機尺寸也是同理這樣計算得到的。
那下面來看看資源文件是怎麼生成的?
實現步驟:
1、在Android studio中安裝ScreenMatch插件
點擊菜單欄上的 File -> Settings -> Plugins ,搜索ScreenMatch關鍵字,安裝插件,安裝成功後,點擊 “OK”,重啓 Andorid Studio 即可,如圖所示:
2、在項目values文件夾下需要一份dimens.xml文件,即前面說的默認基準尺寸文件,如圖所示:
3、插件安裝後,在項目的任意目錄或文件上右鍵,選擇 ScreenMatch 選項,如圖所示:
4、然後選擇需要適配的module ,我這裏測試只有一個,如圖所示:
5、點擊 OK後 ,出現如下彈窗即表示生成資源文件成功,如圖所示:
通過以上的步驟res 目錄下就生成了默認尺寸的所有資源文件啦。
上面步驟是以最小寬度基準值爲375dp,適配的設備最小寬度爲:240,320,384,392,400,410,411,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365生成的文件,當然實際開發需要根據設計圖需求進行設置,這個時候就需要更改基準值及需要適配的適配啦,那下面看看怎麼更改的。
例如現在UI的設計圖最小寬度爲360dp,則需要更改最小寬度基準值爲 360dp。假如我們需要適配的設備最小寬度保留 320,360,384,392,400,410,411,480即可,如果還需要添加其他最小寬度的設備自行加上即可,首先我們需要找到插件的screenMatch.properties配置文件並打開,如圖所示:
然後我們需要在配置文件修改,修改下圖中 1、3、4處的值即可,如圖所示:
值得注意的是上圖設置的值單位都爲dp。
我們再來看看1、2、3、4表示什麼意思:
1、表示最小寬度基準值,填寫設計圖的最小寬度值即可。
2、表示插件默認適配的最小寬度值,即默認情況下會生成如下值的 dimens.xml 文件。
3、表示需要適配的最小寬度值,即你想生成哪些 dimens.xml 文件。
4、忽略不需要適配的最小寬度值,即忽略掉插件默認生成的 dimens.xml 文件。
修改完配置文件後,重新執行步驟3就會生成新的資源文件。
我們再來看一下sw限定符適配方案的優點:
sw限定符適配方案和寬高限定符適配方案最大的區別在於:前者有很好的容錯機制,如果沒有value-sw360dp文件夾,系統會向下尋找,比如離360dp最近的只有value-sw350dp,那麼Android就會選擇value-sw350dp文件夾下面的資源文件。這個特性就完美的解決了寬高限定符適配方案的容錯問題。而且sw限定符適配方案非常穩定,極低概率出現意外。在插件的配合下,學習成本也比較低。
那這種方案有沒缺點呢?當然也是有的
- 最明顯的肯定也是佔用資源大,會增加APK的體積
- 在佈局中引用dimens的方式,在維護過程中修改會比較麻煩。
- 侵入性高,比如想切換其它適配方案,由於每個layout文件中有大量的dimens引用,修改起來工作量會非常巨大,切換成本非常高。
爲了防止篇幅過長,這裏就先介紹這兩種適配方案,後面幾種後面會一一解析,敬請期待。歡迎關注公衆號【龍旋】能獲取最新更新內容哦。