首先,說下概念(網上很多帖子幾個地方都搞混了,理一下):
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,里面有這么幾個值
- metrics.density;
- 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 。不要問我為什么和公式不符了,全是單位的問題,物理老師死得早啊