是Density independent pixel的縮寫,指的是抽象意義上的像素。跟設備的屏幕密度有關係。android
它是Android裏的一個單位,dip和dp是同樣的。express
Google的官方說明是這樣的:
app
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.ui
就是說在160dpi的屏幕上,1dip=1px。
它跟屏幕密度有關,若是屏幕密度大,1dip表明的px就多,好比在320dpi的屏幕上,1dip=2px。spa
爲何咱們在佈局的時候最好要用dip,不要用px?
是由於這個世界上存在着不少不一樣屏幕密度的手機,屏幕密度是什麼?就是dpi,就是單位長度裏的像素數量。3d
想象一下,若是這些手機的尺寸同樣,屏幕密度相差很大,那麼是否是說一個手機水平方向上像素不多,另外一個手機水平方向上像素不少?那咱們畫一樣pix數量的時候,它顯code
示的長度不就會不同了?blog
好比下面圖中的兩個手機,同時設置2px長度的Button,在屏幕密度較高的手機裏就會顯示的比較小。ip
而同時設置的2dip長度的Button,在兩個手機上顯示的大小是同樣的。
因此若是你在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"/>
顯示的界面是這樣的:
getResources().getDisplayMetrics().densityDpi 就是屏幕密度。
getResources().getDisplayMetrics().density 也能夠理解爲1dip至關於多少個px啦。
上面的dpi是240,1dip=1.5px
你看,100dip的Button是100pxButton的1.5倍長吧。