Android屏幕適配總結

Px,DPI,DIP,Density,Sp等概念

Px

Pixel,像素。不同設備顯示效果相同,這裏的“相同”是指像素數不會變,比如指定UI長度是100px,那不管分辨率是多少UI長度都是100px。也正是因爲如此才造成了UI在小分辨率設備上被放大而失真,在大分辨率上被縮小。

Screen Size

表示屏幕尺寸。一般所說的手機屏幕大小如1.6英寸、1.9英寸、2.2英寸,都是指的對角線的長度,而不是手機面積。我們可以根據勾股定理獲取手機的寬和長,當然還有面積。

Resolution

表示分辨率。指手機屏幕垂直和水平方向上的像素個數。

比如分辨率480*320指設備垂直方向有480個像素點,水平方向有320個像素點。

DPI

dots per inch,像素密度,即屏幕每英寸所包含的像素數

例如QVGA(320*240)分辨率的屏幕物理尺寸是2英寸*1.5英寸,它的DPI爲160dpi

Google官方指定按照下列標準對DPI進行區分:

這裏寫圖片描述

Density

表示密度,沒有沒單位,就是一個比例值,也可以叫縮放係數,值爲DPI/160常見取值 1, 1.5 ,2,3,4

DIP

Density-independent pixel,與設備無關的像素。Px= DIP * (DPI / 160)

使用DIP可以使不同設備上顯示的物理尺存大致一樣

爲什麼是大致一樣呢?因爲我們平時所說的DPI:120(low)、160(medium)、240(high)、 320(xhigh),只是一個大概值。比如實際設備的DPI可能是243dp,但是根據標準,就被歸爲240dp了,也就是就近取了一個標準值

Sp

Scale-independent Pixels,縮放獨立像素,用於字體顯示Sp其實和DIP類似。關於Sp, 官方文檔的描述是這樣的:

Scale-independent Pixels – This is like the dp unit, but it is also scaled by the user’s font size preference. It is recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density and the user’s preference.

大致的意思是:Sp除了受屏幕密度影響外,還受到用戶的字體大小影響(我們可以進入系統設置中修改字體大小)。通常情況下,建議使用Sp來跟隨用戶字體大小設置。

適配方法

佈局使用

儘量使用相對佈局(RelativeLayout)和線性佈局(LinearLayout)。

LinearLayout使用”wrap_content“,”match_parent“和”weight“已經可以構建出不錯的佈局。

但是LinearLayout無法準確地控制子視圖之間的位置關係,只能簡單的一個挨着一個地排列。如果需要精準地定位,就應該使用RelativeLayout。

根據屏幕的配置來加載相應的佈局

最小寬度限定符

根據設定的不同寬度,不同的屏幕寬度加載不同的佈局(Android 3.2版本之後引入的,推薦使用)。

例如:

適配手機的單面板(默認)佈局:res/layout/main.xml

適配尺寸>7寸平板的雙面板佈局:res/layout-sw600dp/main.xml

對於最小寬度≥ 600 dp 的設備系統會自動加載 layout-sw600dp/main.xml(雙面板)佈局,否則系統就會選擇 layout/main.xml(單面板)佈局(這個選擇過程是Android系統自動選擇的)。

  • sw xxxdp,即small width的縮寫,其不區分方向,即無論是寬度還是高度,只要大於 xxxdp,就採用次此佈局。

屏幕方向限定符

根據屏幕方向進行佈局的調整。

每種屏幕尺寸和屏幕方向下的佈局行爲方式如下所示:

  • 小屏幕,縱向:單面板,帶徽標
  • 小屏幕,橫向:單面板,帶徽標
  • 7 英寸平板電腦,縱向:單面板,帶操作欄
  • 7 英寸平板電腦,橫向:雙面板,寬,帶操作欄
  • 10 英寸平板電腦,縱向:雙面板,窄,帶操作欄
  • 10 英寸平板電腦,橫向:雙面板,寬,帶操作欄
  • 電視,橫向:雙面板,寬,帶操作欄

佈局的具體命名規範,詳見Android屏幕適配全攻略(最權威的官方適配指導)

尺寸限定符

根據不同的屏幕尺寸加載不同的佈局(這種方式只適合Android 3.2版本之前)。

自動拉伸位圖,nine-patch圖

對於圖片在不同屏幕密度上顯示相同的像素效果,使用nine-patch圖,即後綴爲.9的格式。

使用百分比適配

我們假設手機屏幕的寬度都是320某單位,那麼我們將一個屏幕寬度的總像素數平均分成320份,每一份對應具體的像素就可以了。

下面是生成的一個320*480分辨率的文件,因爲寬高分割之後總分數和像素數相同,所以x1就是1px,以此類推:

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="x1">1.0px</dimen>
<dimen name="x2">2.0px</dimen>
<dimen name="x3">3.0px</dimen>
...
<dimen name="x319">319.0px</dimen>
<dimen name="x320">320px</dimen>
</resources>

那麼1080*1960分辨率下是什麼樣子呢?

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="x1">3.37px</dimen>
<dimen name="x2">6.75px</dimen>
<dimen name="x3">10.12px</dimen>
...
<dimen name="x319">1076.62px</dimen>
<dimen name="x320">1080px</dimen>
</resources>

我們可以看下,由於1080和320是3.37倍的關係,所以x1=3.37px

無論在什麼分辨率下,x320都是代表屏幕寬度,y480都是代表屏幕高度

然後我們要把生成的所有values文件夾放到res目錄下:

這裏寫圖片描述

但是手機屏幕的分辨率太多了,我們會漏掉對應分辨率的values文件夾。倘若沒有對應的values文件夾,就會使用默認的values文件夾。如果默認的values文件夾沒有(即沒有對應的分辨率、沒有對應dimen)就會報錯,從而無法進行屏幕適配。

所以我只能在默認的values文件夾裏面也創建對應文件,但是裏面的數據卻不好處理,因爲不知道分辨率,我只好默認爲x1=1dp保證儘量兼容。這也是這個解決方案的幾個弊端,對於沒有生成對應分辨率文件的手機,會使用默認values文件夾。

提供備用位圖

由於 Android 可在具有各種屏幕密度的設備上運行,因此我們提供的位圖資源應始終可以滿足各類普遍密度範圍的要求:低密度、中等密度、高密度以及超高密度。這將有助於我們的圖片在所有屏幕密度上都能得到出色的質量和效果。

要生成這些圖片,我們應先提取矢量格式的原始資源,然後根據以下尺寸範圍針對各密度生成相應的圖片:

  • xxxhdpi:4.0
  • xxhdpi:3.0
  • xhdpi:2.0
  • hdpi:1.5
  • mdpi:1.0(最低要求)

也就是說,如果我們爲xhdpi設備生成了200x200px尺寸的圖片,就應該使用同一資源爲xxxhdpi、xxhdpi、hdpi和mdpi設備分別生成400x400、300x300 、150x150和75x75尺寸的圖片

然後,將生成的圖片文件放在res/下的相應子目錄中(mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi),系統就會根據運行您應用的設備的屏幕密度自動選擇合適的圖片。關於系統如何加載資源圖片的策略,請移步Android屏幕適配經驗談

  • 如果是.9圖或者是不需要多個分辨率的圖片,放在drawable文件夾即可。

  • 對應分辨率的圖片要正確的放在合適的文件夾,否則會造成圖片拉伸等問題。

使用一套圖

考慮到多套圖片資源佔內存過大,可以只用一套圖。

Google官方給出的設計圖尺寸有兩種方案,一種是以mdpi設計,然後對應放大得到更高分辨率的圖片,另外一種則是以高分辨率作爲設計大小,然後按照倍數對應縮小到小分辨率的圖片

使用第一種方法,如果把圖片放大有可能會不清晰,建議使用第二種方法。

分辨率可以以1280*720或者是1960*1080作爲主要分辨率進行設計

參考:
1.谷歌官方文檔–支持多種屏幕
2.Android屏幕適配全攻略(最權威的官方適配指導)
3.Android 屏幕適配方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章