定義
使得某一元素在Android不同尺寸、不同分辨率的手機上具備相同的顯示效果
相關重要概念
屏幕尺寸
含義:手機對角線的物理尺寸
單位:英寸(inch),1英寸=2.54cm
Android手機常見的尺寸有5寸、5.5寸、6寸等等
屏幕分辨率
含義:手機在橫向、縱向上的像素點數(shù)總和
一般描述成屏幕的"寬x高”=AxB
含義:屏幕在橫向方向(寬度)上有A個像素點,在縱向方向
(高)有B個像素點
例子:1080x1920趁窃,即寬度方向上有1080個像素點,在高度方向上有1920個像素點
單位:px(pixel)急前,1px=1像素點
UI設計師的設計圖會以px作為統(tǒng)一的計量單位
Android手機常見的分辨率:320x480醒陆、480x800、720x1280裆针、1080x1920
屏幕像素密度
含義:每英寸的像素點數(shù)
單位:dpi(dots per ich)
假設設備內每英寸有160個像素刨摩,那么該設備的屏幕像素密度=160dpi
安卓手機對于每類手機屏幕大小都有一個相應的屏幕像素密度:
屏幕尺寸、分辨率据块、像素密度三者關系
一部手機的分辨率是寬x高码邻,屏幕大小是以寸為單位,那么三者的關系是:
三者關系示意圖
數(shù)學不太差的人應該能懂.....吧另假?
不懂沒關系像屋,在這里舉個例子
假設一部手機的分辨率是1080x1920(px),屏幕大小是5寸边篮,問密度是多少己莺?
解:請直接套公式
密度無關像素
含義:density-independent pixel奏甫,叫dp或dip,與終端上的實際物理像素點無關凌受。
單位:dp阵子,可以保證在不同屏幕像素密度的設備上顯示相同的效果
Android開發(fā)時用dp而不是px單位設置圖片大小,是Android特有的單位
場景:假如同樣都是畫一條長度是屏幕一半的線胜蛉,如果使用px作為計量單位挠进,那么在480x800分辨率手機上設置應為240px;在320x480的手機上應設置為160px誊册,二者設置就不同了领突;如果使用dp為單位,在這兩種分辨率下案怯,160dp都顯示為屏幕一半的長度君旦。
dp與px的轉換
因為ui設計師給你的設計圖是以px為單位的,Android開發(fā)則是使用dp作為單位的嘲碱,那么我們需要進行轉換:
在Android中金砍,規(guī)定以160dpi(即屏幕分辨率為320x480)為基準:1dp=1px
獨立比例像素
含義:scale-independent pixel,叫sp或sip
單位:sp
Android開發(fā)時用此單位設置文字大小麦锯,可根據(jù)字體大小首選項進行縮放
推薦使用12sp恕稠、14sp、18sp离咐、22sp作為字體設置的大小谱俭,不推薦使用奇數(shù)和小數(shù),容易造成精度的丟失問題宵蛀;小于12sp的字體會太小導致用戶看不清
解決方案
“布局控件”匹配
本質:使得布局組件在不同屏幕密度上顯示相同的像素效果
做法1:使用密度無關像素
由于各種屏幕的像素密度都有所不同,因此相同數(shù)量的像素在不同設備上的實際大小也有所差異县貌,這樣使用像素(px)定義布局尺寸就會產生問題术陶。
因此,請務必使用密度無關像素 dp或獨立比例像素 sp單位指定尺寸煤痕。
相關概念介紹
密度無關像素
含義:density-independent pixel梧宫,叫dp或dip,與終端上的實際物理像素點無關摆碉。
單位:dp塘匣,可以保證在不同屏幕像素密度的設備上顯示相同的效果
Android開發(fā)時用dp而不是px單位設置圖片大小,是Android特有的單位
場景:假如同樣都是畫一條長度是屏幕一半的線巷帝,如果使用px作為計量單位忌卤,那么在480x800分辨率手機上設置應為240px;在320x480的手機上應設置為160px楞泼,二者設置就不同了驰徊;如果使用dp為單位笤闯,在這兩種分辨率下,160dp都顯示為屏幕一半的長度棍厂。
dp與px的轉換
因為ui給你的設計圖是以px為單位的颗味,Android開發(fā)則是使用dp作為單位的,那么該如何轉換呢牺弹?
在Android中浦马,規(guī)定以160dpi(即屏幕分辨率為320x480)為基準:1dp=1px
獨立比例像素
含義:scale-independent pixel,叫sp或sip
單位:sp
Android開發(fā)時用此單位設置文字大小张漂,可根據(jù)用戶的偏好文字大小/字體大小首選項進行縮放
推薦使用12sp晶默、14sp、18sp鹃锈、22sp作為字體設置的大小荤胁,不推薦使用奇數(shù)和小數(shù),容易造成精度的丟失問題屎债;小于12sp的字體會太小導致用戶看不清
所以仅政,為了能夠進行不同屏幕像素密度的匹配,我們推薦:
使用dp來代替px作為控件長度的統(tǒng)一度量單位
使用sp作為文字的統(tǒng)一度量單位
“圖片資源”匹配
本質:使得圖片資源在不同屏幕密度上顯示相同的像素效果
做法:提供備用位圖(符合屏幕尺寸的圖片資源)
由于 Android 可在各種屏幕密度的設備上運行盆驹,因此我們提供的位圖資源應該始終可以滿足各類密度的要求:
步驟1:根據(jù)以下尺寸范圍針對各密度生成相應的圖片圆丹。
比如說,如果我們?yōu)?xhdpi 設備生成了 200x200 px尺寸的圖片躯喇,就應該按照相應比例地為 hdpi辫封、mdpi 和 ldpi 設備分別生成 150x150、100x100 和 75x75 尺寸的圖片
即一套分辨率=一套位圖資源(這個當然是Ui設計師做了)
步驟2:將生成的圖片文件放在 res/ 下的相應子目錄中(mdpi廉丽、hdpi倦微、xhdpi、xxhdpi)正压,系統(tǒng)就會根據(jù)運行您應用的設備的屏幕密度自動選擇合適的圖片
步驟3:通過引用 @drawable/id欣福,系統(tǒng)都能根據(jù)相應屏幕的 屏幕密度(dpi)自動選取合適的位圖。
注:
如果是.9圖或者是不需要多個分辨率的圖片焦履,放在drawable文件夾即可
對應分辨率的圖片要正確的放在合適的文件夾拓劝,否則會造成圖片拉伸等問題。
更好地方案解決“圖片資源”適配問題
上述方案是常見的一種方案嘉裤,這固然是一種解決辦法郑临,但缺點在于:
每套分辨率出一套圖,為美工或者設計增加了許多工作量
對Android工程文件的apk包變的很大
那么屑宠,有沒有一種方法:
保證屏幕密度適配
可以最小占用設計資源
使得apk包不變大(只使用一套分辨率的圖片資源)
下面我們就來介紹這個方法:
只需選擇唯一一套分辨率規(guī)格的圖片資源
方法介紹
1. 先來理解下Android 加載資源過程
Android SDK會根據(jù)屏幕密度自動選擇對應的資源文件進行渲染加載(自動渲染)
比如說厢洞,SDK檢測到你手機的分辨率是320x480(dpi=160),會優(yōu)先到drawable-mdpi文件夾下找對應的圖片資源;但假設你只在xhpdi文件夾下有對應的圖片資源文件(mdpi文件夾是空的)犀变,那么SDK會去xhpdi文件夾找到相應的圖片資源文件妹孙,然后將原有大像素的圖片自動縮放成小像素的圖片,于是大像素的圖片照樣可以在小像素分辨率的手機上正常顯示获枝。
具體請看http://blog.csdn.net/xiebudong/article/details/37040263
所以理論上來說只需要提供一種分辨率規(guī)格的圖片資源就可以了蠢正。
那么應該提供哪種分辨率規(guī)格呢?
如果只提供ldpi規(guī)格的圖片省店,對于大分辨率(xdpi嚣崭、xxdpi)的手機如果把圖片放大就會不清晰
所以需要提供一套你需要支持的最大dpi分辨率規(guī)格的圖片資源,這樣即使用戶的手機分辨率很小懦傍,這樣圖片縮小依然很清晰雹舀。那么這一套最大dpi分辨率規(guī)格應該是哪種呢?是現(xiàn)在市面手機分辨率最大可達到1080X1920的分辨率(dpi=xxdpi=480)嗎粗俱?
2. xhdpi應該是首選
原因如下:
xhdpi分辨率以內的手機需求量最旺盛
目前市面上最普遍的高端機的分辨率還多集中在720X1080范圍內(xhdpi)说榆,所以目前來看xhpdi規(guī)格的圖片資源成為了首選
節(jié)省設計資源&工作量
在現(xiàn)在的App開發(fā)中(iOS和Android版本),有些設計師為了保持App不同版本的體驗交互一致寸认,可能會以iPhone手機為基礎進行設計签财,包括后期的切圖之類的。
設計師們一般都會用最新的iPhone6和iPhone5s(5s和5的尺寸以及分辨率都一樣)來做原型設計偏塞,所有參數(shù)請看下圖
iPhone主流的屏幕dpi約等于320, 剛好屬于xhdpi唱蒸,所以選擇xhdpi作為唯一一套dpi圖片資源,可以讓設計師不用專門為Android端切圖灸叼,直接把iPhone的那一套切好的圖片資源放入drawable-xhdpi文件夾里就好神汹,這樣大大減少的設計師的工作量!