天天看點

dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析

一、基本概念

  • dip        : Device independent pixels ,裝置獨立像素。
  • dp        :就是dip
  • px        : 像素
  • dpi       :dots per inch , 直接來說就是一英寸多少個像素點。常見取值 120,160,240。我一般稱作像素密度,簡稱密度
  • density : 直接翻譯的話貌似叫 密度。常見取值 1.5 , 1.0 。和标準dpi的比例(160px/inc)
  • 分辨率   : 橫縱2個方向的像素點的數量,常見取值 480X800 ,320X480
  • 螢幕尺寸: 螢幕對角線的長度。電腦電視同理。
  • 螢幕比例的問題。因為隻确定了對角線長,2邊長度還不一定。是以有了4:3、16:9這種,這樣就可以算出螢幕邊長了。

二、應用

  在android裡面,擷取一個視窗的metrics,裡面有這麼幾個值

    metrics.density; 
     metrics.densityDpi;      

  densityDpi : 就是我們常說的dpi。

  density      :  其實是 DPI / (160像素/英寸) 後得到的值。是不是有點奇怪,因為我帶了機關。。。這個涉及到後面一個比較重要的東西,後面再說。

  從上面就看得出了,DPI本身的機關也是 像素/英寸,是以density其實是沒機關的,他就是一個比例值。

  而dpi的機關是 像素/英寸,比較符合實體上面的密度定義,密度不都是機關度量的值麼,是以我更喜歡把dpi叫像素密度,簡稱密度,density還是就叫density。

三、各機關間轉換

1. 計算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。

2. 計算 dp 與 px

  我們寫布局的時候,肯定還是要知道1個dp到底有多少px的。

标準dpi = 160 像素/英寸

  換算公式如下: dp = (dpi/标準dpi)* px 

  為了友善,假設dpi是240 像素/英寸 , 那麼density就是1.5

  那麼就是 dp=1.5px 

可推出:

px = (标準dpi/dpi) * dp

 3. 為啥 标準dpi = 160

  (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的。

四、 示例分析

1. 螢幕尺寸(screen size)

  就是我們平常講的手機螢幕大小,是螢幕的對角線長度,一般講的大小機關都是英寸。

  比如iPhone5S的螢幕尺寸是4英寸。Samsung Note3是5.7英寸。

  

dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析

圖 1

2.像素(pixel)

  想像把螢幕放大再放大,對!看到的那一個個小點或者小方塊就是像素了。

dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析

圖 2

3.分辨率(Resolution)

  是指螢幕上垂直方向和水準方向上的像素個數。

  比如iPhone5S的分辨率是1136*640;Samsung Note3的分辨率是1920*1080;

dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析

圖 3 

4.dpi

  是dot per inch的縮寫,就是每英寸的像素數,也叫做螢幕密度。這個值越大,螢幕就越清晰。

  iPhone5S的dpi是326; Samsung Note3 的dpi是386

dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析

圖 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。

為什麼我們在布局的時候最好要用dip,不要用px?

   是因為這個世界上存在着很多不同螢幕密度的手機,螢幕密度是什麼?就是dpi,就是機關長度裡的像素數量。

  想象一下,如果這些手機的尺寸一樣,螢幕密度相差很大,那麼是不是說一個手機水準方向上像素很少,另一個手機水準方向上像素很多?那我們畫同樣pix數量的時候,它顯

  示的長度不就會不一樣了?

  比如下面圖中的兩個手機,同時設定2px長度的Button,在螢幕密度較高的手機裡就會顯示的比較小。

  而同時設定的2dip長度的Button,在兩個手機上顯示的大小是一樣的。

dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析

圖 5

  是以如果你在App布局中都用的px作為機關,那麼你的App跑在各個裝置上就會出現奇奇怪怪的現象了。 

  來看一下emulator上的效果,我定義了兩個Button,分别用px和dip做機關。

  布局檔案裡這樣寫

dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析
<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"/>      
dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析

顯示的界面是這樣的:

  

dpi 、 dip 、分辨率、螢幕尺寸、px、density 關系以及換算 一、基本概念 二、應用 三、各機關間轉換 四、 示例分析

圖 6 

  getResources().getDisplayMetrics().densityDpi 就是螢幕密度。

  getResources().getDisplayMetrics().density 也可以了解為1dip相當于多少個px啦。

  上面的dpi是240,1dip=1.5px

  你看,100dip的Button是100pxButton的1.5倍長吧。