1. 程式人生 > >簡述Android單位dp、sp、dip、px、等的區別和使用

簡述Android單位dp、sp、dip、px、等的區別和使用

 廢話就不多說了,直接說重點。首先解釋下這幾個單位的代表意思。

由於過去通常以畫素為單位設計計算機使用者介面。當一個畫素在80x80的時候,在高解析度顯示器上執行該程式,則使用者介面會顯得很小。所以採用與解析度無關的度量單位來開發程式就能夠解決這個問題。而Android應用開發支援不同的度量單位。

一.解釋下:

dip: device independent pixels(裝置獨立畫素). 不同裝置有不同的顯示效果,這個和裝置硬體有關,一般我們為了支援 WVGA、HVGA和QVGA 推薦使用這個,不依賴畫素。

dp: dip是一樣的

px: pixels(畫素). 不同裝置顯示效果相同,一般我們HVGA代表320x480畫素,這個用的比較多。

pt: point,是一個標準的長度單位,1pt=1/72英寸=0.035釐米,用於印刷業,非常簡單易用;
sp: scaled pixels(放大畫素). 主要用於字型顯示best for textsize。

in(英寸):長度單位。 1英寸=2.54釐米(約);
mm(毫米):長度單位。

當然我們光是瞭解不會用那就不行了。

二.度量單位的換算公式

在android原始碼包TypedValue.java中,我們看如下函式:

    public static float applyDimension(int unit, float value, DisplayMetrics metrics) {

        switch (unit) {

        case COMPLEX_UNIT_PX:

            return value;

        case COMPLEX_UNIT_DIP:

            return value * metrics.density;

        case COMPLEX_UNIT_SP:

            return value * metrics.scaledDensity;

        case COMPLEX_UNIT_PT:

            return value * metrics.xdpi * (1.0f/72);

        case COMPLEX_UNIT_IN:

            return value * metrics.xdpi;

        case COMPLEX_UNIT_MM:

            return value * metrics.xdpi * (1.0f/25.4f);

        }

        return 0;

    }

   該函式功能:是把各單位換算為畫素。

   metrics.density:預設值為DENSITY_DEVICE / (float) DENSITY_DEFAULT;

   metrics.scaledDensity:預設值為DENSITY_DEVICE / (float) DENSITY_DEFAULT;

   metrics.xdpi:預設值為DENSITY_DEVICE;

   DENSITY_DEVICE:為螢幕密度

   DENSITY_DEFAULT:預設值為160

然後我們還得了解Android有哪些屏:如下表

螢幕

Tyep

寬度

Pixels

高度

Pixels

尺寸

Range(inches)

螢幕密度

QVGA

240

320

2.6-3.0

low

WQVGA

240

400

3.2-3.5

low

FWQVGA 

240

432

3.5-3.8

low

HVGA 

320

480

3.0-3.5

Medium

WVGA 

480

800

3.3-4.0

High

FWVGA

480

854

3.5-4.0

High

WVGA

480

800

4.8-5.5

Medium

FWVGA 

480

854

5.0-5.8

Medium

備註

目前android預設的low=120 ;Medium =160; High = 240

px和dip的區別
px就是畫素的意思:1px代表螢幕上一個物理的畫素點;所以用畫素相當於實際畫素畫。那麼100px的圖片不同的手機上就會出現大小不一樣。就向100長度的線在200螢幕寬上顯示的就是一半,而在300螢幕上就只佔用了1/3。

dip與dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,後來為了與sp統一就建議使用dp這個名字了。這裡就細細解釋下dp:它與“畫素密度”密切相關,所以首先我們解釋一下什麼是畫素密度?

畫素密度:假設手機螢幕解析度為240x320,螢幕的物理尺寸為1.5英寸x2英寸,(1英寸(in)=2.54釐米(cm)),那麼每英寸包含的畫素點的數量為240/1.5=160dpi(寬)或320/2=160dpi(高),160dpi就是這部手機的畫素密度。

剛才表中已經說明了Android手機分(low=120 ;Medium =160; High = 240,VeryHigh=320)低,中,高,超高四等密度,而他們對應的dp到px的係數分別為0.75、1、1.5和2,這個係數乘以dp長度就是畫素數。

最後:在大小螢幕相同,解析度不一樣時候(480x320解析度或者800x480),假設一個80dp長度的圖片,換算成240dpi的手機上實際顯示為80x1.5=120px,在320dpi的手機上實際顯示為80x2=160px,這樣使用dp就感覺差別不是很大了。

sp:

與縮放無關的抽象畫素(Scale-independent Pixel)。sp和dp很類似但唯一的區別是,Android系統允許使用者自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是“正常”時1sp=1dp=0.00625英寸,而當文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸。類似我們在windows裡調整字型尺寸以後的效果——視窗大小不變,只有文字大小改變。

        使用建議文字的尺寸一律用sp單位,非文字的尺寸一律使用dp單位。例如textSize="16sp"、layout_width="60dp";偶爾需要使用px單位,例如需要在螢幕上畫一條細的分隔線時:

         歡迎各位留言指點。