本帖最后由 小鬼. 于 2016-5-18 17:33 編輯
一、基本概念- dip : Density independent pixels ,設(shè)備無(wú)關(guān)像素。
- dp :就是dip
- px : 像素
- dpi :dots per inch , 直接來(lái)說(shuō)就是一英寸多少個(gè)像素點(diǎn)。常見(jiàn)取值 120,160,240。我一般稱作像素密度,簡(jiǎn)稱密度
- density : 直接翻譯的話貌似叫 密度。常見(jiàn)取值 1.5 , 1.0 。和標(biāo)準(zhǔn)dpi的比例(160px/inc)
- 分辨率 : 橫縱2個(gè)方向的像素點(diǎn)的數(shù)量,常見(jiàn)取值 480X800 ,320X480
- 屏幕尺寸: 屏幕對(duì)角線的長(zhǎng)度。電腦電視同理。
- 屏幕比例的問(wèn)題。因?yàn)橹淮_定了對(duì)角線長(zhǎng),2邊長(zhǎng)度還不一定。所以有了4:3、16:9這種,這樣就可以算出屏幕邊長(zhǎng)了。
二、應(yīng)用 在android里面,獲取一個(gè)窗口的metrics,里面有這么幾個(gè)值 metrics.density; metrics.densityDpi;
densityDpi : 就是我們常說(shuō)的dpi。 density : 其實(shí)是 DPI / (160像素/英寸) 后得到的值。是不是有點(diǎn)奇怪,因?yàn)槲規(guī)Я藛挝?。。。這個(gè)涉及到后面一個(gè)比較重要的東西,后面再說(shuō)。 從上面就看得出了,DPI本身的單位也是 像素/英寸,所以density其實(shí)是沒(méi)單位的,他就是一個(gè)比例值。 而dpi的單位是 像素/英寸,比較符合物理上面的密度定義,密度不都是單位度量的值么,所以我更喜歡把dpi叫像素密度,簡(jiǎn)稱密度,density還是就叫density。
三、各單位間轉(zhuǎn)換1. 計(jì)算dpi 比如一個(gè)機(jī)器,屏幕4寸,分辨率480X800,他的dpi能算么。
因?yàn)椴恢肋呴L(zhǎng),肯定不能分開(kāi)算,4是對(duì)角線長(zhǎng)度,那直接用勾股定理算對(duì)角線像素,除以4,算出來(lái)大概是 dpi = 233 像素/英寸。
那么density就是 (233 px/inch)/(160 px/inch)=1.46 左右 順帶說(shuō)下,android默認(rèn)的只有3個(gè)dpi,low、medium和high,對(duì)應(yīng) 120、160、240,如果沒(méi)有特別設(shè)置,所有的dpi都會(huì)被算成這3個(gè),其中的default就是160。
2. 計(jì)算 dp 與 px
我們寫(xiě)布局的時(shí)候,肯定還是要知道1個(gè)dp到底有多少px的。 換算公式如下: dp = (DPI/(160像素/英寸))px = density px
注意,這里都是帶單位的。px是單位,dp是單位,density沒(méi)單位。 為了方便,假設(shè)dpi是240 像素/英寸 , 那么density就是1.5 那么就是 dp=1.5px ,注意這是帶了單位的,也就是 設(shè)備無(wú)關(guān)像素 = density 像素 那么轉(zhuǎn)換為數(shù)值計(jì)算的話,應(yīng)該是下面這個(gè)式子 PX = density * DP 也就是
像素值 = density * 設(shè)備無(wú)關(guān)像素值 ,請(qǐng)注意這里有個(gè)值字。
3. 為啥 標(biāo)準(zhǔn)dpi = 160
(1)Android Design [1] 里把主流設(shè)備的 dpi 歸成了四個(gè)檔次,120 dpi、160 dpi、240 dpi、320 dpi 實(shí)際開(kāi)發(fā)當(dāng)中,我們經(jīng)常需要對(duì)這幾個(gè)尺寸進(jìn)行相互轉(zhuǎn)換(比如先在某個(gè)分辨率下完成設(shè)計(jì),然后縮放到其他尺寸微調(diào)后輸出),一般按照 dpi 之間的比例即 2:1.5:1:0.75 來(lái)給界面中的元素來(lái)進(jìn)行尺寸定義。 也就是說(shuō)如果以 160 dpi 作為基準(zhǔn)的話,只要尺寸的 DP 是 4 的公倍數(shù),XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可滿足所有尺寸下都是整數(shù) pixel 。 但假設(shè)以 240 dpi 作為標(biāo)準(zhǔn),那需要 DP 是 3 的公倍數(shù),XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2 而以 LDPI 和 XHDPI 為基準(zhǔn)就更復(fù)雜了,所以選擇 160 dpi (2)這個(gè)在Google的官方文檔中有給出了解釋,因?yàn)榈谝豢預(yù)ndroid設(shè)備(HTC的T-Mobile G1)是屬于160dpi的。
四、 示例分析1. 屏幕尺寸(screen size)
就是我們平常講的手機(jī)屏幕大小,是屏幕的對(duì)角線長(zhǎng)度,一般講的大小單位都是英寸。
比如iPhone5S的屏幕尺寸是4英寸。Samsung Note3是5.7英寸。 2.像素(pixel)
想像把屏幕放大再放大,對(duì)!看到的那一個(gè)個(gè)小點(diǎn)或者小方塊就是像素了。
3.分辨率(Resolution)
是指屏幕上垂直方向和水平方向上的像素個(gè)數(shù)。
比如iPhone5S的分辨率是1136*640;Samsung Note3的分辨率是1920*1080;
4.dpi
是dot per inch的縮寫(xiě),就是每英寸的像素?cái)?shù),也叫做屏幕密度。這個(gè)值越大,屏幕就越清晰。
iPhone5S的dpi是326; Samsung Note3 的dpi是386 5.dip 是Density independent pixel的縮寫(xiě),指的是抽象意義上的像素。跟設(shè)備的屏幕密度有關(guān)系。 它是Android里的一個(gè)單位,dip和dp是一樣的。 Google的官方說(shuō)明是這樣的:
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. 就是說(shuō)在160dpi的屏幕上,1dip=1px。
它跟屏幕密度有關(guān),如果屏幕密度大,1dip代表的px就多,比如在320dpi的屏幕上,1dip=2px。
為什么我們?cè)诓季值臅r(shí)候最好要用dip,不要用px?
是因?yàn)檫@個(gè)世界上存在著很多不同屏幕密度的手機(jī),屏幕密度是什么?就是dpi,就是單位長(zhǎng)度里的像素?cái)?shù)量。 想象一下,如果這些手機(jī)的尺寸一樣,屏幕密度相差很大,那么是不是說(shuō)一個(gè)手機(jī)水平方向上像素很少,另一個(gè)手機(jī)水平方向上像素很多?那我們畫(huà)同樣pix數(shù)量的時(shí)候,它顯示的長(zhǎng)度不就會(huì)不一樣了? 比如下面圖中的兩個(gè)手機(jī),同時(shí)設(shè)置2px長(zhǎng)度的Button,在屏幕密度較高的手機(jī)里就會(huì)顯示的比較小。 而同時(shí)設(shè)置的2dip長(zhǎng)度的Button,在兩個(gè)手機(jī)上顯示的大小是一樣的。 所以如果你在App布局中都用的px作為單位,那么你的App跑在各個(gè)設(shè)備上就會(huì)出現(xiàn)奇奇怪怪的現(xiàn)象了。 來(lái)看一下emulator上的效果,我定義了兩個(gè)Button,分別用px和dip做單位。 布局文件里這樣寫(xiě) <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相當(dāng)于多少個(gè)px啦。
上面的dpi是240,1dip=1.5px
你看,100dip的Button是100pxButton的1.5倍長(zhǎng)吧。
|