淺談 Android 屏幕適配

幾組概念

分辨率
屏幕上物理像素的總數。添加對多種屏幕的支持時, 應用不會直接使用分辨率;而只應關注通用尺寸和密度組指定的屏幕尺寸及密度。

屏幕尺寸: 按屏幕對角測量的實際物理尺寸。目前市面上說的幾英寸是對角線的英寸數
為簡便起見,Android 將所有實際屏幕尺寸分組為四種通用尺寸:小、 正常、大和超大。(太寬泛了, 現在已不建議使用)

DPI(Dots Per Inch):每英寸點數,表示指屏幕密度。是測量空間點密度的單位,最初應用于打印技術中,它表示每英寸能打印上的墨滴數量。較小的 DPI 會產生不清晰的圖片。
后來DPI的概念也被應用到了計算機屏幕上,計算機屏幕一般采用 PPI(Pixels Per Inch)來表示一英寸屏幕上顯示的像素點的數量,現在 DPI 也被引入。

為簡便起見,Android 將所有屏幕密度分組為六種通用密度

屏幕像素密度 ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi
描述 低密度屏幕 中等密度 高密度屏幕 超高密度屏幕 - -
約為 ~120dpi ~160dpi ~240dpi ~320dpi ~480dpi ~640dpi
之間的縮放比 3 4 6 8 12 16
? 0.75x 1.0x 1.5x 2.0x 3.0x 4.0x

PPI(Pixels Per Inch):圖像分辨率;是每英寸圖像內有多少個像素點,分辨率的單位為ppi,通常叫做像素每英寸。圖像分辨率一般被用于ps中,用來改變圖像的清晰度。

密度無關像素 (dp)
在定義 UI 布局時應使用的虛擬像素單位,用于以密度無關方式表示布局維度或位置。
密度無關像素等于 160 dpi 屏幕上的一個物理像素,這是 系統為“中”密度屏幕假設的基線密度。在運行時,系統 根據使用中屏幕的實際密度按需要以透明方式處理 dp 單位的任何縮放 。dp 單位轉換為屏幕像素很簡單: px = dp * (dpi / 160)
例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定義應用的 UI 時應始終使用 dp 單位 ,以確保在不同密度的屏幕上正常顯示 UI。

支持每種密度的 位圖可繪制對象的相對大小

適配方案

密度獨立性

應用顯示在密度不同的屏幕上時,如果它保持用戶界面元素的物理尺寸(從 用戶的視角),便可實現“密度獨立性” 。
Android 系統可幫助您的應用以兩種方式實現密度獨立性:

  • 系統根據當前屏幕密度擴展 dp 單位數
  • 系統在必要時可根據當前屏幕密度將可繪制對象資源擴展到適當的大小
    • nodpi:它可用于您不希望縮放以匹配設備密度的位圖資源。例如.9圖推薦放在此目錄
    • anydpi:此限定符適合所有屏幕密度,其優先級高于其他限定符。 這對于矢量可繪制對象很有用。 此項為 API 級別 21 中新增配置

最佳做法

  • 使用新尺寸限定符
    smallestWidth (sw<N>dp)

屏幕的基本尺寸,由可用屏幕區域的最小尺寸指定。 具體來說,設備的smallestWidth 是屏幕可用高度和寬度的最小尺寸(您也可以將其視為屏幕的“最小可能寬度”)。無論屏幕的當前方向如何,您均可使用此限定符確保應用 UI 的可用寬度至少為 <N>dp。

例如,如果布局要求屏幕區域的最小尺寸始終至少為 600 dp,則可使用此限定符創建布局資源 res/layout-sw600dp/。僅當可用屏幕的最小尺寸至少為 600dp 時,系統才會使用這些資源,而不考慮 600dp 所代表的邊是用戶所認為的高度還是寬度。smallestWidth 是設備的固定屏幕尺寸特性;設備的 smallestWidth 不會隨屏幕方向的變化而改變

設備的 smallestWidth 將屏幕裝飾元素和系統 UI 考慮在內。例如,如果設備的屏幕上有一些永久性 UI 元素占據沿 smallestWidth 軸的空間,則系統會聲明 smallestWidth 小于實際屏幕尺寸,因為這些屏幕像素不適用于您的 UI。

這可替代通用化的屏幕尺寸限定符(小、正常、大、超大), 可讓您為 UI 可用的有效尺寸定義不連續的數值。 使用 smallestWidth 定義一般屏幕尺寸很有用,因為寬度 通常是設計布局時的驅動因素。UI 經常會垂直滾動,但 對其水平需要的最小空間具有非常硬性的限制。可用的寬度也是 確定是否對手機使用單窗格布局或是對平板電腦使用多窗格布局的關鍵因素。因此,您可能最關注每部 設備上的最小可能寬度。
最小寬度限定符可讓您通過指定某個最小寬度(以 dp 為單位)來定位屏幕。例如,標準 7 英寸平板電腦的最小寬度為 600 dp,因此如果您要在此類屏幕上的用戶界面中使用雙面板(但在較小的屏幕上只顯示列表),您可以使用上文中所述的單面板和雙面板這兩種布局,但您應使用 sw600dp 指明雙面板布局僅適用于最小寬度為 600 dp 的屏幕,而不是使用 large 尺寸限定符。

  • 在 XML 布局文件中指定尺寸時使用 wrap_content、match_parent 或 dp 單位 。
  • 不要在應用代碼中使用硬編碼的像素值
  • 不要使用 AbsoluteLayout(已棄用), 而是考慮線性布局使用權重分配寬高, support庫中約束布局, 可以是布局更加扁平化
  • 為不同屏幕密度提供替代位圖可繪制對象

圖標的適配

在進行開發的時候,我們需要把合適大小的圖片放在合適的文件夾里面。下面以圖標設計為例進行介紹。

在設計圖標時,對于五種主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和XXXHDPI)應按照 2:3:4:6:8 的比例進行縮放。
雖然 Android 也支持低像素密度 (LDPI) 的屏幕,但無需為此費神,系統會自動將 HDPI 尺寸的圖標縮小到 1/2 進行匹配。
建議以高分辨率作為設計大小,然后按照倍數對應縮小到小分辨率的圖片。
一般情況下,我們只需要提供3套切圖資源就可以滿足安卓工程師的適配,分別是 HDPI、XHDPI、 XXHDPI 3套切圖資源。
推薦使用的辦法就是只提供最大尺寸的切圖,xxhdpi 的高清圖, 然后可以交給安卓工程師自己去縮放適配其他分辨率。

圖標的各個屏幕密度的對應尺寸

.9圖自動拉伸

ImageView的ScaleType屬性

設置 不同的 ScaleType 會得到不同的顯示效果,一般情況下,設置為 centerCrop 能獲得較好的適配效果。fixXY 可能導致變形.

動態設置

  • 有一些情況下,我們需要動態的設置控件大小或者是位置,比如說 popwindow 的顯示位置和偏移量等,這個時候我們可以動態的獲取當前的屏幕屬性,然后設置合適的數值
  • 使用官方百分比布局
dependencies{
    compile'com.android.support:percent:25.1.0'
}

使用布局別名

最小寬度限定符僅適用于 Android 3.2 及更高版本。因此,如果我們仍需使用與較低版本兼容的概括尺寸范圍(小、正常、大和特大)。例如,如果要將用戶界面設計成在手機上顯示單面板,但在 7 英寸平板電腦、電視和其他較大的設備上顯示多面板,那么我們就需要提供以下文件:

res/values-large/layout.xml:

res/values-sw600dp/layout.xml:

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容