dpi 、dip 、px、density、screenSize關係以及換算
轉自:http://blog.csdn.net/dinko321/article/details/7992776
dip : device independent pixels ,裝置無關畫素。 我看很多帖子寫的五花八門的,關於d的,什麼display啊各種都有,既然是裝置無關,我還是覺得device靠譜。dp就是dip,dip可以換算為px,dip和其它沒有關係
px : 畫素不多說
dpi :dots per inch , 直接來說就是一英寸多少個點。常見取值 120,160,240。我一般稱作畫素密度,簡稱密度
density : 直接翻譯的話貌似叫 密度。常見取值 1.5 , 1.0 。
解析度: 橫縱2個方向的畫素點的數量,常見取值 480X800 ,320X480
螢幕尺寸: 螢幕對角線的長度。電腦電視同理。
這裡還涉及另外一個問題,就是螢幕比例的問題。因為只確定了對角線長,2邊長度還不一定。所以有了4:3、16:9這種,這樣就可以算出螢幕邊長了。
重點來了,網上很多帖子直接把 density 叫做“密度”,然後就說他是畫素密度,然後就說他是dpi。
在Android裡面,獲取一個視窗的metrics,裡面有這麼幾個值
- metrics.density;
- metrics.densityDpi;
從上面就看得出了,DPI本身的單位也是 畫素/英寸,所以density其實是沒單位的,他就是一個比例值。
而dpi的單位是 畫素/英寸,比較符合物理上面的密度定義,密度不都是單位度量的值麼,所以我更喜歡把dpi叫畫素密度,簡稱密度,density還是就叫density。
然後,來算算dpi。
比如一個機器,螢幕4存,解析度480X800,他的dpi能算麼。
因為不知道邊長,肯定不能分開算,4是對角線長度,那直接用勾股定理算對角線畫素,除以4,算出來大概是 dpi = 233 畫素/英寸。
那麼density就是 (233 px/inch)/(160 px/inch)=1.46 左右
為什麼要除以160,是一種規範:
在160dpi的手機上1px=1dp,這句話的以上是說 ,每一個dpi被分割成了160塊,每一塊有一個畫素點,每一塊就是一個dp。 那麼1dp=1px
而320dpi的手機上,解析度是上一個手機的兩倍,每一個dpi也被分割成了160塊,每一塊有兩個畫素點,每一塊也是一個dp,那麼1dp=2px
順帶說下,android預設的只有3個dpi,low、medium和high,對應 120、160、240,如果沒有特別設定,所有的dpi都會被算成這3個,具體可以參考下這個帖子
http://android.tgbus.com/Android/tutorial/201103/347176.shtml
其中的default就是160。
然後就該算了,我們寫佈局的時候,肯定還是要知道1個dp到底有多少px的。
換算公式如下: dp = (DPI/(160畫素/英寸))px = density px
注意,這裡都是帶單位的。px是單位,dp是單位,density沒單位。
為了方便,假設dpi是240 畫素/英寸 , 那麼density就是1.5
那麼就是 dp=1.5px ,注意這是帶了單位的,也就是 裝置無關畫素 = density 畫素
那麼轉換為數值計算的話,應該是下面這個式子
PX = density * DP
也就是
畫素值 = density * 裝置無關畫素值 ,請注意這裡有個值字。