之前都是在自研的產品上做開發,而且我們的屏幕是1dip=1px的,所以在寫App布局的時候,隨便寫單位,也沒覺得什么不妥。可是近期我把以前的App里面的一些自定義控件在emulator上跑的時候,才發現顯示怎么變奇怪了。這才好好了解了一下Android的顯示相關的東西,整理在這邊。
1.屏幕尺寸(screen size)
就是我們平常講的手機屏幕大小,是屏幕的對角線長度,一般講的大小單位都是英寸。
比如iPhone5S的屏幕尺寸是4英寸。Samsung Note3是5.7英寸。
2.像素(pixel)
想像把屏幕放大再放大,對!看到的那一個個小點或者小方塊就是像素了。
3.分辨率(Resolution)
是指屏幕上垂直方向和水平方向上的像素個數。
比如iPhone5S的分辨率是1136*640;
Samsung Note3的分辨率是1920*1080;
4.dpi
是dot per inch的縮寫,就是每英寸的像素數,也叫做屏幕密度。這個值越大,屏幕就越清晰。
iPhone5S的dpi是326
Samsung Note3 的dpi是386
下面是誇張了的像素顯示,意思是dpi高的,單位長度里的像素多。
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。
我覺得google的文檔里的公式是不是寫錯了,應該是 dp=dx*(dpi / 160) 才對嘛。
為什么我們在布局的時候最好要用dip,不要用px?
--》是因為這個世界上存在着很多不同屏幕密度的手機,屏幕密度是什么?就是dpi,就是單位長度里的像素數量。
想象一下,如果這些手機的尺寸一樣,屏幕密度相差很大,那么是不是說一個手機水平方向上像素很少,另一個手機水平方向上像素很多?那我們畫同樣pix數量的時候,它顯示的長度不就會不一樣了?
比如下面圖中的兩個手機,同時設置2px長度的Button,在屏幕密度較高的手機里就會顯示的比較小。
而同時設置的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倍長吧。