A. android屏幕適配的哪些事
為了保證用戶獲得一致的用戶體驗效果,使得某一元素在Android不同尺寸、不同解析度的手機上具備相同的顯示效果,則需要我們進行屏幕適配。
基礎概念
屏幕尺寸
屏幕尺寸是指屏幕對角線的長度,單位是英寸,1 inch=2.54 cm
屏幕解析度
手機在橫向和縱向上的像素點數總和,單位是像素(pixel),1px = 1像素點,舉個栗子,1080x1920,即寬度方向上有1080個像素點,在高度方向上有1920個像素點。
屏幕像素密度
每英寸像素點個數,單位是dpi,dots per inch。為簡便起見,Android 將所有屏幕密度分組為六種通用密度: 低、中、高、超高、超超高和超超超高。
ldpi(低)~120dpi
mdpi(中)~160dpi
hdpi(高)~240dpi
xhdpi(超高)~320dpi
xxhdpi(超超高)~480dpi
xxxhdpi(超超超高)~640dpi
B. Android 屏幕適配
1: dp: android 尺寸的基本單位。 在不同的解析度的手機裡面,1dp對應著不同數量的px, 這樣就實現了dp定義一個控制項大小的時候,在不同解析度手機里表現出相應大小的像素值。
2: 屏幕解析度: 1080下160, 表示寬度有1080個像素點而高度有2160個像素點。常見的解析度有320x480, 480x800, 720x1280, 1080x1920等。
3: 屏幕尺寸: 以寸為單位, Android設備對角線的長度
4: 像素密度: 每英寸的像素點
5: 屏幕尺寸, 解析度,像素密度 三者之間的關系:
密度(dpi)= √(寬2 + 高2)/屏幕尺寸
6: px:像素,是屏幕上顯示數據的最基本的點
7: dpi:屏幕像素密度,每英寸上的像素點數
8: sp:與dp類似,通常用於指定字體的大小,當用戶修改手機顯示的字體時,字體大小會隨之改變。
1: dp適配方案: Android自帶的原始的適配方案, 在不同的解析度手機裡面表現出相應大小的像素點。
缺點: Android的碎片化嚴重, 如果生產廠家沒有根據屏幕尺寸、解析度和像素密度的關系來規則定義, 或者出一些亂七八糟的屏幕大小,這樣的適配方案就不在適合了。
2: 寬高限定符:枚舉所有的屏幕寬高像素值,根據等比縮放去適配。如果沒有找到對應的屏幕, 則取默認的。 目前這種方案已經被棄用。
缺點:
1: 佔用資源大,會增加APK的體積。
2: 容錯機制大需要精準命中資源文件才能適配,比如1920x1080的手機就一定要找到1920x1080的限定符,否則就只能用統一的默認的dimens文件了。而使用默認的尺寸的話,UI就很可能變形。
3:AndroidAutoLayout適配方案(停止維護)
4: SW限定符適配方案:(smallestWidth最小寬度適配)
Android 會去識別屏幕可用高度或者寬度的最小尺寸的dp值。然後根據識別到的結果去對應的資源文件裡面去找尋相應的結果。
如何生成:ScreenMatch插件
此方案跟寬高限定的適配方案相比,有很好的容錯機制, 如果沒有找到對應的適配寬度, 那麼會在vlues文件裡面去找跟他最接近的寬度。
5:今日頭條適配方案:
1>: px 轉 dp 的公式 dp = px / density.不管我們設定的單位是什麼, 最終我們都會將這些單位長度轉化為px的。density就是他們的轉化比, 所以,動態改變這個轉化比也是可以達到我們適配屏幕的目的的。
2>: 通過修改density值,強行把所有不同尺寸解析度的手機的寬度dp值改成一個統一的值(在清單文件中定義),這樣就解決了所有的適配問題。
3>: Density = 當前設備屏幕總寬度(單位為像素)/ 設計圖總寬度(單位為 dp) ;
4>:引入了AndroidAutoSize屏幕適配框架:
https://github.com/JessYanCoding/AndroidAutoSize
最後, 最重要的................
點贊 點贊 點贊, 不重要的事情也就說3遍......
C. SmallestWidth限定符適配 - dimens.xml 文件生成
在Android開發中,適配不同解析度和像素密度的屏幕是常見的需求。SmallestWidth限定符適配方案提供了一種簡便方法來生成系列的dimens.xml文件,以實現不同設備上的界面適配。
首先,了解一些基礎知識:Android手機常見解析度包括320x480、480x800、720x1280、1080x1920等。屏幕像素密度的計算是通過手機解析度除以屏幕尺寸得出。例如,對於解析度為1080x1920的5寸屏幕,密度為3.5。
在設計界面時,設計師通常提供設計圖的最小寬度,單位為dp。這個值是適配不同設備的關鍵。接下來,將設計圖的最小寬度作為基準值,生成所有設備對應的dimens.xml文件。然而,自動生成工具如ScreenMatch可能存在適配不完全的問題,如最小寬度為320dp的設備可能沒有得到正確適配。
為解決這一問題,可以對ScreenMatch插件進行優化,以生成更加精準的適配文件。在項目中,首先在默認values文件夾中創建一份dimens.xml文件。然後,通過右鍵選擇ScreenMatch選項,指定基於哪個mole生成適配文件,並配置最小寬度基準值、適配的設備最小寬度dp值。完成配置後,生成的文件將包含所有需要的dimens.xml文件。
通過配置文件,可以靈活調整最小寬度基準值和需要適配的設備最小寬度dp值,以滿足不同的設計需求。配置完成後,再次執行生成操作,即可得到符合設計要求的適配文件。如果設計圖的最小寬度為360dp,可以按照默認值生成適配文件;如果需要特定的最小寬度適配,如375dp,只需修改配置文件中的相關值即可。
在實際開發中,根據設計圖標注的尺寸,在布局中直接使用對應的dp值,這極大地簡化了界面適配的過程。若需在代碼中動態設置dp或sp值,可通過getDimension()方法從資源文件中獲取所需值進行設置。
綜上所述,使用SmallestWidth限定符適配方案生成dimens.xml文件,結合合適的工具和配置,可以實現高效、精確的界面適配。簡化了開發過程,提高了開發效率,是Android開發中處理屏幕適配問題的重要手段。
D. 一種非常好用的Android屏幕適配
網上關於屏幕適配的文章已經鋪天蓋地了,為什麼我還要講?因為網上現在基本都是使用 屏幕解析度限定符 進行適配,即每種屏幕解析度的設備需要定義一套 dimens.xml 文件。由於不同解析度的設備太多了,而且有些設備還有虛擬按鍵(例如華為手機),這樣就還需要每個有虛擬按鍵的設備加多一套 dimens.xml 文件,再加上平板那些你會發現 dimens.xml 文件所佔的體積已經超過 2M 了!這絕對不是我們想要的。
我這里要講的是使用 sw<N>dp 限定符,即 smallestWidth(最小寬度) 限定符 來進行適配,使用這種方式只需要少量 dimens.xml 文件即可達到適配,而且根本不用考慮虛擬按鍵的問題。如果只適配手機,dimens.xml 文件所佔的體積只有 100 多 KB,即使加上平板和 TV,也就 500 多 KB,完全可以接收。這種方案已經在自己多個項目中應用過了,經過幾十台手機測試過,基本不會出現適配有問題的情況。製作生成對應 dimens.xml 文件插件(後面會講)的作者也說過他在待過的兩家大公司實踐過,所以請放心使用。
關於為什麼要進行屏幕適配,什麼是 dp、dpi 這些概念我就不去一一講解了,網上很多文章。這里我推薦幾篇講的比較好的:
屏幕解析度限定符適配需要在 res 文件夾下創建各種屏幕解析度對應的 values-xxx 文件夾,如下圖:
然後根據一個基準解析度,例如基準解析度為 1280x720,將寬度分成 720 份,取值為 1px~720px,將高度分成 1280 份,取值為 1px~1280px,生成各種解析度對應的 dimens.xml 文件。如下分別為解析度 1280x720 與 1920x1080 所對應的橫向 dimens.xml 文件:
假設設計圖上的一個控制項的寬度為 720px,那麼布局中就寫 android:layout_width="@dimen/x720" ,當運行程序的時候,系統會根據設備的解析度去尋找對應的 dimens.xml 文件。例如運行在解析度為 1280x720 的設備上,系統會自動找到對應的 values-1280x720 文件夾下的 lay_x.xml 文件,由上圖可知 x720 對應的值為
720.px,可鋪滿該屏幕寬度。運行在解析度為 1920x1080 的設備上,系統會自動找到對應的 values-1920x1080 文件夾下的 lay_x.xml 文件,由上圖可知 x720 對應的值為 1080.0px,可鋪滿該屏幕寬度。這樣就達到了屏幕適配的要求!
smallestWidth 限定符適配原理與屏幕解析度限定符適配原理一樣,系統都是根據限定符去尋找對應的 dimens.xml 文件。例如程序運行在最小寬度為 360dp 的設備上,系統會自動找到對應的 values-sw360dp 文件夾下的 dimens.xml 文件。區別就在於屏幕解析度限定符適配是拿 px 值等比例縮放,而 smallestWidth 限定符適配是拿 dp 值來等比縮放而已。需要注意的是「最小寬度」是不區分方向的,即無論是寬度還是高度,哪一邊小就認為哪一邊是「最小寬度」。如下分別為最小寬度為 360dp 與最小寬度為 640dp 所對應的 dimens.xml 文件:
ScreenUtils——> ScreenUtils
既然原理都一樣,都需要多套 dimens.xml 文件,那為什麼要選擇 smallestWidth 限定符適配呢?
大多數 UI 設計師提供的設計圖無非就幾種,它們對應的獲取方式如下:
這些文件當然不會手動去寫,網上已經有大神提供了自動生成這些文件的插件 ScreenMatch 。但是這個插件還是有點問題的:
基於以上問題,我在該插件的源碼上優化生成了新的插件 ScreenMatch ,由於插件庫已經有原作者的插件了,所以我就不重復造輪子上傳到插件庫了,你直接用本地安裝的方式安裝即可。
工具使用步驟:
然後選擇在哪個 mole 下執行適配。即基於哪個 mole 下的 res/values/dimens.xml 文件作為基準 dimens.xml 文件,生成的其他尺寸 dimens.xml 文件放在哪個 mole 下。例如選擇 app,然後點擊 OK ,出現如下界面表示生成文件成功。如下圖:
然後再看看 res 目錄下會自動生成一堆 dimens.xml 文件,如下圖:
通過上面的步驟就已經生成了所有設備對應的 dimens.xml 文件。
步驟 3 是以插件默認的最小寬度基準值為 360dp,適配的設備最小寬度為
320,360,384,392.7272,400,410,411.4285,432,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365(包含了平板和 TV )生成的文件,但實際情況要根據設計圖和需求設置。
例如設計圖的最小寬度為 375dp,則需要更改最小寬度基準值為 375dp。如果項目只需要適配手機的話,適配的設備最小寬度保留 320,360,384,392.7272,400,410,411.4285,432,480 即可,若發現手機還有其他最小寬度自行加上即可,也麻煩把該最小寬度提供給我,我們一起來完善該份適配。
以上修改需要在配置文件里修改,即 screenMatch.properties 文件,該配置文件是執行完上面第 3 步後自動生成在項目的跟目錄下的。如下圖:
打開配置文件,修改下圖中 1、3、4 的值即可。(圖中單位均為 dp)
1:最小寬度基準值,填寫設計圖的最小寬度值即可。
2:插件默認適配的最小寬度值,即默認情況下會生成如下值的 dimens.xml 文件。
3:需要適配的最小寬度值(如果是小數,則保留 4 位小數。例如 392.727272...,則取 392.7272),即你想生成哪些 dimens.xml 文件。
4:忽略不需要適配的最小寬度值,即忽略掉插件默認生成的 dimens.xml 文件。
配置文件修改完成後,重新執行第 3 步,生成新的 dimens.xml 文件。
當然!如果你的設計圖也是標準的 360dp,那麼上面的步驟你可以忽略。直接復制我 github 上你需要的 dimens.xml 文件到你的項目即可, 默認的 values 文件夾下也需要一份 。
設計圖標注多少 dp,布局中就寫多少 dp ,非常方便!
大多數 UI 設計師提供的設計圖無非就幾種,它們對應的使用方式如下:
說了這么多,其實只需要簡單的 2 步:
很多人肯定會有疑問,難道我用了這套適配方案就可以全部直接寫死寬高了?那肯定不是的,如果一些好用的適配技巧能實現的,那就不要用直接寫死寬高的方式。這套適配方案搭配下面這些適配技巧可以讓你的屏幕適配更完美。
絕對布局(AbsoluteLayout)直接使用 X、Y 坐標來控制控制項的位置,對於屏幕碎片化這么嚴重的今天,使用絕對布局對於屏幕適配來說就是災難性的,所以 Google 已經廢棄了該控制項。
相對布局(RelativeLayout)或者約束布局(ConstraintLayout)就不一樣了,相對布局的子控制項之間使用 相對位置 的方式排列,即使屏幕的大小改變,控制項的相對位置也不會變化,與屏幕大小無關,靈活性很強。約束布局也是類似的,通過對某些控制項進行約束來確定它們之間的位置。
Nine-Patch 圖片是一種被特殊處理過的 PNG 圖片,你可以指定哪些區域可以拉伸而哪些區域不可以。例如聊天界面中的聊天氣泡背景圖就需要做成 Nine-Patch 圖片,因為每條消息的字數不是固定的,如果背景圖片不能隨著字數的長短進行縮放,那麼就會導致背景圖片變形。
因為各種屏幕高寬比並不是固定的,有 16:9、4:3,還有全面屏的 19.5:9 等等,如果強行將寬高都適配那隻會導致布局變形。
例如一個控制項的寬高為 360dp 和 640dp,如果將它顯示在寬高為 360dp 和 640dp 的設備上是正常鋪滿整個屏幕的,但是顯示在寬高為 360dp 和 780dp 的設備上高度則不能鋪滿,如果你讓高度鋪滿,而寬度又保持不變,那就會出現變形的情況。所以這也就是為什麼目前市面上的屏幕適配方案只能以寬或高一個維度去適配,另一個方向用滑動或權重的方式去適配的原因。
那你為什麼說高度也能適配呢?
這里說的高度也能適配指的是在不同解析度和密度的手機上能達到等比縮放的適配,其他屏幕適配方案也是一樣的。
注意:smallestWidth 限定符適配的效果是讓不同解析度和密度的設備上能達到以設計圖等比縮放的適配,如果設備與設計圖相差太大時並不能達到很好的適配效果,需要單獨出圖,其他屏幕適配方案也是一樣的。
同橫屏道理一樣,平板、TV 與手機的寬高差距太大,想要平板、TV 也能完全適配,那就只能讓設計師出一套平板、TV 的設計圖,然後單獨寫一套平板、TV 的布局文件。
注意:再說一遍,smallestWidth 限定符適配的效果是讓不同解析度和密度的設備上能達到以設計圖等比縮放的適配,如果設備與設計圖相差太大時並不能達到很好的適配效果,需要單獨出圖,其他屏幕適配方案也是一樣的。
github 地址: ScreenAdaptation
參考資料: