1. 程式人生 > >dpi 、dip 、px、density、screenSize關係以及換算

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,裡面有這麼幾個值

  1. metrics.density;  
  2. metrics.densityDpi;  
densityDpi就是我們常說的dpi。density其實是  DPI / (160畫素/英寸)  後得到的值。是不是有點奇怪,因為我帶了單位。。。這個涉及到後面一個比較重要的東西,後面再說。

從上面就看得出了,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 * 裝置無關畫素值  ,請注意這裡有個字。