Android屏幕適配總結
前言
目錄
定義
使得某一元素在Android不同尺寸、不同分辨率的手機上具備相同的顯示效果
相關重要概念
屏幕尺寸
- 含義:手機對角線的物理尺寸
- 單位:英寸(inch),1英寸=2.54cm
Android手機常見的尺寸有5寸、5.5寸、6寸等等
屏幕分辨率
- 含義:手機在橫向、縱向上的像素點數總和
- 一般描述成屏幕的"寬x高”=AxB
- 含義:屏幕在橫向方向(寬度)上有A個像素點,在縱向方向(高)有B個像素點
- 例子:1080x1920,即寬度方向上有1080個像素點,在高度方向上有1920個像素點
- 單位:px(pixel),1px=1像素點
UI設計師的設計圖會以px作為統一的計量單位
- Android手機常見的分辨率:320x480、480x800、720x1280、1080x1920(前兩者現在基本已經見不到了)
屏幕像素密度
- 含義:每英寸的像素點數
- 單位:dpi(dots per ich)
假設設備內每英寸有160個像素,那么該設備的屏幕像素密度=160dpi
- 安卓手機對于每類手機屏幕大小都有一個相應的屏幕像素密度:
密度類型 | 代表的分辨率(px) | 屏幕像素密度(dpi) |
---|---|---|
低密度(ldpi) | 240x320 | 120 |
中密度(mdpi) | 320x480 | 160 |
高密度(hdpi) | 480x800 | 240 |
超高密度(xhdpi) | 720x1280 | 320 |
超超高密度(xxhdpi) | 1080x1920 | 480 |
屏幕尺寸、分辨率、像素密度三者關系
一部手機的分辨率是寬x高,屏幕大小是以寸為單位,那么三者的關系是:
密度無關像素(重點)
- 含義:density-independentpixel,叫dp或dip,與終端上的實際物理像素點無關。
- 單位:dp,可以保證在不同屏幕像素密度的設備上顯示相同的效果
- Android開發時用dp而不是px單位設置圖片大小,是Android特有的單位
- 場景:假如同樣都是畫一條長度是屏幕一半的線,如果使用px作為計量單位,那么在480x800分辨率手機上設置應為240px;在320x480的手機上應設置為160px,二者設置就不同了;如果使用dp為單位,在這兩種分辨率下,160dp都顯示為屏幕一半的長度。
- dp與px的轉換
因為ui設計師給你的設計圖是以px為單位的,Android開發則是使用dp作為單位的,那么我們需要進行轉換:
密度類型 | 代表的分辨率(px) | 屏幕密度(dpi) | 換算(px/dp) | 比例 |
---|---|---|---|---|
低密度(ldpi) | 240x320 | 120 | 1dp=0.75px | 3 |
中密度(mdpi) | 320x480 | 160 | 1dp=1px | 4 |
高密度(hdpi) | 480x800 | 240 | 1dp=1.5px | 6 |
超高密度(xhdpi) | 720x1280 | 320 | 1dp=2px | 8 |
超超高密度(xxhdpi) | 1080x1920 | 480 | 1dp=3px | 12 |
在Android中,規定以160dpi(即屏幕分辨率為320x480)為基準:1dp=1px
獨立比例像素
- 含義:scale-independent pixel,叫sp或sip
- 單位:sp
- Android開發時用此單位設置文字大小,可根據用戶的偏好文字大小/字體大小首選項進行縮放
- 推薦使用12sp、14sp、18sp、22sp作為字體設置的大小,不推薦使用奇數和小數,容易造成精度的丟失問題;小于12sp的字體會太小導致用戶看不清
結論
所以,為了能夠進行不同屏幕像素密度的匹配,我們推薦:
- 使用dp來代替px作為控件長度的統一度量單位
- 使用sp作為文字的統一度量單位
可是,請看以下一種場景:
Nexus5的總寬度為360dp,我們現在在水平方向上放置兩個按鈕,一個是150dp左對齊,另外一個是200dp右對齊,那么中間留有10dp間隔;但假如同樣地設置在Nexus S(屏幕寬度是320dp),會發現,兩個按鈕會重疊,因為320dp<200+150dp
從上面可以看出,由于Android屏幕設備的多樣性,如果使用dp來作為度量單位,并不是所有的屏幕的寬度都具備相同的dp長度
再次明確,屏幕寬度和像素密度沒有任何關聯關系
所以說,dp解決了同一數值在不同分辨率中展示相同尺寸大小的問題(即屏幕像素密度匹配問題),但卻沒有解決設備尺寸大小匹配的問題。(即屏幕尺寸匹配問題)
當然,我們一開始討論的就是屏幕尺寸匹配問題,使用match_parent、wrap_content和weight,盡可能少用dp來指定控件的具體長寬,大部分的情況我們都是可以做到適配的。
那么該如何解決控件的屏幕尺寸和屏幕密度的適配問題呢?
從上面可以看出:
- 因為屏幕密度(分辨率)不一樣,所以不能用固定的px
- 因為屏幕寬度不一樣,所以要小心的用dp
因為本質上是希望使得布局組件在不同屏幕密度上顯示相同的像素效果,那么,之前是繞了個彎使用dp解決這個問題,那么到底能不能直接用px解決呢?
即根據不同屏幕密度,控件選擇對應的像素值大小
解決方案
- 百分比適配方法
- autoLayout
百分比適配方法
步驟:
- 以某一分辨率為基準,生成所有分辨率對應像素數列表
- 將生成像素數列表存放在res目錄下對應的values文件下
- 根據UI設計師給出設計圖上的尺寸,找到對應像素數的單位,然后設置給控件即可
詳細步驟請看: Android 屏幕適配方案
jar包下載地址: github
autoLayout
詳細步驟請看:github