有一段日子,關係像素的問題一直困擾着我,理不清他們之間的關係,直到在網上查閱了很多相關知識後,纔有了
比較清楚的認識,感謝度娘!現作爲筆記寫下來,也希望能對別人有所幫助。
px:平常所說的1920×1080說的是像素數量,也就是1920px×1080px,代表手機高度上有1920個像素點,寬度上
1080個像素點。我們在做android ui開發時不建議使用px單位,因爲同樣100px的圖片,在不同手機上顯示的實際大小
可能不同。
dpi:像素密度。假設有一部手機,屏幕的物理尺寸爲1.5英寸x2英寸,屏幕分辨率爲240x320,則我們可以計算出在
這部手機的屏幕上,每英寸包含的像素點的數量爲240/1.5=160dpi(橫向)或320/2=160dpi(縱向),160dpi就是這部
手機的像素密度,像素密度的單位dpi是Dots Per Inch的縮寫,即每英寸像素數量。橫向和縱向的這個值都是相同的,原因
是大部分手機屏幕使用正方形的像素點。Android系統定義了四種像素密度:低(120dpi)、中(160dpi)、高(240dpi)
和超高(320dpi),它們對應的dp到px的係數分別爲0.75、1、1.5和2,這個係數乘以dp長度就是像素數。例如界面上有一
個長度爲“80dp”的圖片,那麼它在240dpi的手機上實際顯示爲80x1.5=120px,在320dpi的手機上實際顯示爲80x2=160px。
如果你拿這兩部手機放在一起對比,會發現這個圖片的物理尺寸“差不多”,這就是使用dp作爲單位的效果。
dp和dip:一樣的概念。其實dp就是爲了使得開發者設置的長度能夠根據不同屏幕(分辨率/尺寸也就是dpi)獲得不同的像
數數量(px)。如:我將一個控件設置長度爲1dp,那麼在160dpi上該控件長度爲1px,在240dpi的屏幕上該控件的長度爲
1*240/160=1.5個像素點,也就是dp會隨着不同屏幕而改變控件長度的像素數量。記住一點,dp最終都要化爲像素數量來衡
量大小的,因爲只有像素數量最直觀。我們在做ui時一般就得使用dp作爲單位。
sp:與縮放無關的抽象像素(Scale-independent Pixel)。sp和dp很類似但唯一的區別是,Android系統允許用戶自定義
文字尺寸大小(小、正常、大、超大等等),當文字尺寸是“正常”時1sp=1dp=0.00625英寸,而當文字尺寸是“大”或“超
大”時,1sp>1dp=0.00625英寸。類似我們在windows裏調整字體尺寸以後的效果——窗口大小不變,只有文字大小改變。
也就是說sp是用來指定字體的大小。
dp轉px:對於android 來說,最終我們能讀懂或者衡量的都是px,所以最後我們都將dp化爲px好理解一點。我總結了dp轉
px的公式:dp值×(當前dpi/160dpi)= 當前的像素數目。 那麼“當前dpi”怎麼知道是多少呢?當然也有方法的,我們可以寫代
碼獲得:
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int densityDpi = dm.densityDpi; //當前dpi:120/160/240/320 float density = dm.density; //0.75/1.0/1.5/2.0
也可以用dp值×density得到px的值。