1. 程式人生 > >Android中px,dp,sp單位的區別和應用

Android中px,dp,sp單位的區別和應用

下面的解釋基本是百度得來的

px:

px就是pixel的縮寫啦,pixel即畫素,它不是自然界的長度單位。px是就是一張圖片中最小的點,一張點陣圖就是由這些點構成的。1024px就是1024畫素,最簡單的你可以在windows桌面屬性裡的“設定”看到,如果是1024×768,也就是說水平方向上有1024個點,垂直方向上有768個點。誰能說出一個“點”有多長多大麼?可以畫的很小,也可以很大。如果點很小,那畫面就清晰,我們稱它為“解析度高”,反之,就是“解析度低”。所以,畫素的大小是會“變”的,也稱為“相對長度”。

開發中px比較少用,但是一般在畫1px的分割線時使用,就是要細線。如果用1dp的,你會看到線略粗

dp:

dp(dip)概念:與密度無關的畫素,這是一個基於螢幕物理密度的抽象單位。

這裡要解釋一下密度的概念,密度(dpi):每英寸包含的畫素個數(單位是dpi),1dp實際上相當於密度為160dpi的屏上的一個點(可否理解為物理尺寸?)。也就是說,如果螢幕物理密度是160dpi時,dp和px是等效的。

換算公式1: px = dp * (dpi / 160)

dpi首先是可以算的:

DPI = 寬 / ((尺寸2 × 寬2) / (寬2 + 高2))1/2 = 長 / ((尺寸2 × 高2) / (寬2 + 高2))1/2

大概計算方法如下,以寬為例:
1.比如解析度為320 × 480,則長寬比為1:1.5
2.比如螢幕尺寸為3.6”,則根據勾股定理有:
高2 + 寬2 = 3.62,
又因為,高 = 1.5 × 寬,代入上式,有:
寬2 + 2.25 × 寬2 = 12.96,
得出,寬 = (12.96/3.25)1/2 = 1.9969
3.寬為320px,分佈在1.9969”上,因此密度為320 / 1.9969 = 160.2467

詭異事情1:G7的真實dpi是252,根據我以前的理解,310dp換算成px應該是:310 * (252 / 160) = 488畫素,而G7水平方向是480px,310dp在這上面絕對滿屏都不止了,事實上Android系統並沒有拿252作為dpi來計算,而是將G7視 作hdpi裝置,然後使用240dpi來計算最終畫素,所以在G7上320dp剛好是:320 * (240 / 160) = 480畫素,剛好滿屏了,310dp確實要差一點點。

原來這裡的dpi是歸一化後的dpi,可能值120(l)、160(m)、240(h)、 320(x)、480(xxh)

下面來看下dp作用是什麼?

dp脫離螢幕畫素,顯示大小是一樣的,至少看起來是差不多的。

在160dpi上,160dp就是1英寸,在240dpi上,160dp還是1英寸,120dpi和 320dpi也還是1英寸,雖然他們佔用的畫素數不一樣,但是最終顯示出來的效果都是佔用了螢幕上1英寸的範圍。這套體系其實是非常合理的,一個寬為 160dp的按鈕,它在所有裝置上佔用的物理尺寸應該是一樣大才合理,這樣他們對人眼所形成的張角才一樣大,觀看或者閱讀的感覺才一致(姑且不考慮按鈕的 背景是否一樣細緻)。這應該是Android系統引入dp概念的原因,因為手機螢幕的畫素密度相差實在太大了,web那套東西已經完全不適用,你想電腦屏 幕的畫素密度能相差多大?

一英寸有多少個點兒? 我們用來density來分辨
ldpi 120dpi 0.75
mdpi 160dpi 1
hdpi 240dpi 1.5
xhdpi 320dpi 2
有這個表就明白為什麼在160dpi上,160dp就是1英寸,在240dpi上,160dp還是1英寸,120dpi和 320dpi也還是1英寸

具體應用差異看別人寫的後面的例子:http://zhangkun716717-126-com.iteye.com/blog/1772696

sp:

可伸縮畫素的意思,採用和dp同樣的設計理念,解決了文字大小設配的問題