dpi 、 dip 、分辨率、屏幕尺寸、px、density 關系以及換算(終結版)


首先,說下概念(網上很多帖子幾個地方都搞混了,理一下):

 

dip : device independent pixels ,設備無關像素。 我看很多帖子寫的五花八門的,關於d的,什么display啊各種都有,既然是設備無關,我還是覺得device靠譜。

   dp就是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,里面有這么幾個值

 

[java]  view plain copy
 
  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 左右

 

順帶說下,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 * 設備無關像素值  ,請注意這里有個值字。

 

 

 

所以,90px 就應該是 60 dp 。不要問我為什么和公式不符了,全是單位的問題,物理老師死得早啊 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM