dip : Density independent pixels ,設備無關像素。
html
dp :就是dipandroid
px : 像素express
dpi :dots per inch , 直接來講就是一英寸多少個像素點。常見取值 120,160,240。我通常稱做像素密度,簡稱密度app
density : 直接翻譯的話貌似叫 密度。常見取值 1.5 , 1.0 。和標準dpi的比例(160px/inc)佈局
分辨率 : 橫縱2個方向的像素點的數量,常見取值 480X800 ,320X480ui
屏幕尺寸: 屏幕對角線的長度。電腦電視同理。spa
屏幕比例的問題。由於只肯定了對角線長,2邊長度還不必定。因此有了4:三、16:9這種,這樣就能夠算出屏幕邊長了。翻譯
在android裏面,獲取一個窗口的metrics,裏面有這麼幾個值設計
metrics.density; metrics.densityDpi;
densityDpi : 就是咱們常說的dpi。code
density : 實際上是 DPI / (160像素/英寸) 後獲得的值。是否是有點奇怪,由於我帶了單位。。。這個涉及到後面一個比較重要的東西,後面再說。
從上面就看得出了,DPI自己的單位也是 像素/英寸,因此density實際上是沒單位的,他就是一個比例值。
而dpi的單位是 像素/英寸,比較符合物理上面的密度定義,密度不都是單位度量的值麼,因此我更喜歡把dpi叫像素密度,簡稱密度,density仍是就叫density。
好比一個機器,屏幕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 * 設備無關像素值 ,請注意這裏有個值字。
(1)Android Design [1] 裏把主流設備的 dpi 歸成了四個檔次,120 dpi、160 dpi、240 dpi、320 dpi
實際開發當中,咱們常常須要對這幾個尺寸進行相互轉換(好比先在某個分辨率下完成設計,而後縮放到其餘尺寸微調後輸出),通常按照 dpi 之間的比例即 2:1.5:1:0.75 來給界面中的元素來進行尺寸定義。
也就是說若是以 160 dpi 做爲基準的話,只要尺寸的 DP 是 4 的公倍數,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 便可知足全部尺寸下都是整數 pixel 。
但假設以 240 dpi 做爲標準,那須要 DP 是 3 的公倍數,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2
而以 LDPI 和 XHDPI 爲基準就更復雜了,因此選擇 160 dpi
(2)這個在Google的官方文檔中有給出瞭解釋,由於第一款Android設備(HTC的T-Mobile G1)是屬於160dpi的。
就是咱們日常講的手機屏幕大小,是屏幕的對角線長度,通常講的大小單位都是英寸。
好比iPhone5S的屏幕尺寸是4英寸。Samsung Note3是5.7英寸。
圖 1
想像把屏幕放大再放大,對!看到的那一個個小點或者小方塊就是像素了。
圖 2
是指屏幕上垂直方向和水平方向上的像素個數。
好比iPhone5S的分辨率是1136*640;Samsung Note3的分辨率是1920*1080;
圖 3
是dot per inch的縮寫,就是每英寸的像素數,也叫作屏幕密度。這個值越大,屏幕就越清晰。
iPhone5S的dpi是326; Samsung Note3 的dpi是386
圖 4
5.dip
是Density independent pixel的縮寫,指的是抽象意義上的像素。跟設備的屏幕密度有關係。
它是Android裏的一個單位,dip和dp是同樣的。
Google的官方說明是這樣的:
Density-independent pixel (dp)
A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.
The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium" density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application's UI, to ensure proper display of your UI on screens with different densities.
就是說在160dpi的屏幕上,1dip=1px。
它跟屏幕密度有關,若是屏幕密度大,1dip表明的px就多,好比在320dpi的屏幕上,1dip=2px。
是由於這個世界上存在着不少不一樣屏幕密度的手機,屏幕密度是什麼?就是dpi,就是單位長度裏的像素數量。
想象一下,若是這些手機的尺寸同樣,屏幕密度相差很大,那麼是否是說一個手機水平方向上像素不多,另外一個手機水平方向上像素不少?那咱們畫一樣pix數量的時候,它顯
示的長度不就會不同了?
好比下面圖中的兩個手機,同時設置2px長度的Button,在屏幕密度較高的手機裏就會顯示的比較小。
而同時設置的2dip長度的Button,在兩個手機上顯示的大小是同樣的。
圖 5
因此若是你在App佈局中都用的px做爲單位,那麼你的App跑在各個設備上就會出現奇奇怪怪的現象了。
來看一下emulator上的效果,我定義了兩個Button,分別用px和dip作單位。
佈局文件裏這樣寫
<Button android:layout_width="100px" android:layout_height="100px" android:text="@string/str_button1"/> <Button android:layout_width="100dip" android:layout_height="100dip" android:text="@string/str_button1"/>
顯示的界面是這樣的:
圖 6
getResources().getDisplayMetrics().densityDpi 就是屏幕密度。 getResources().getDisplayMetrics().density 也能夠理解爲1dip至關於多少個px啦。 上面的dpi是240,1dip=1.5px 你看,100dip的Button是100pxButton的1.5倍長吧。