關於dip,dp,px,sp等單位的說明和區別

來源:互聯網
上載者:User

作者:範曉偉

dip:device independentpixels,裝置獨立像素,一個基於density的抽象單位:


不同裝置不同的顯示效果,這個和裝置硬體有關,一般我們為了支援WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。

在android上開發的程式將會在不同解析度的手機上運行。為了讓程式外觀不至於相差太大,所以引入了dip的概念。比如定義一個矩形10 x 10dip.在解析度為160dpi的屏上,比如G1,正好是10 x 10像素。而在240 dpi的屏,則是15 x 15像素.換算公式為pixs = dips * (density/160). density就是屏的解析度。

這裡要特別注意dip與螢幕密度有關,而螢幕密度又與具體的硬體有關,硬體設定不正確,有可能導致dip不能正常顯示。在螢幕密度為160的顯示屏上,1dip=1px,有時候可能你的螢幕解析度很大如480*800,但是螢幕密度沒有正確設定比如說還是160,那麼這個時候凡是使用dip的都會顯示異常,基本都是顯示過小。

 

dp:與密度無關的像素:

同dip是一樣的。 一種基於螢幕密度的抽象單位。在每英寸160點的顯示器上,1dp =1px。

 

px:pixels,像素:

螢幕上的點,不同裝置不同的顯示屏顯示效果相同,這是絕對像素,是多少就永遠是多少不會改變。

 

sp :scaled pixels — bestfor text size,放大像素,與刻度無關的像素:

主要處理字型的大小,與dp類似,但是可以根據使用者的字型大小喜好設定進行縮放,主要用於字型顯示best for text size。

過去,程式員通常以像素為單位設計電腦使用者介面。例如,定義一個寬度為300像素的表單欄位,列之間的間距為5個像素,表徵圖大小為16×16像素等。這樣處理的問題在於,如果在一個DPI(dpi)更高的新顯示器上運行該程式,則使用者介面會顯得很小。在有些情況下,使用者介面可能會小到難以看清內容。

由此,根據 google 的建議,TextView 的字型大小最好使用 sp 做單位,而且查看TextView的源碼可知 Android預設使用 sp 作為字型大小單位。

根據google的推薦,像素統一使用dip,字型統一使用sp。

 

針對dip和px 的關係,做以下概述:

QVGA屏density=120                        QVGA(240*320)

HVGA屏density=160                        HVGA(320*480)

WVGA屏density=240                      WVGA(480*800)

WQVGA屏density=120                    WQVGA(240*400)

density值表示每英寸有多少個顯示點,與解析度是兩個概念。

 

不同density下螢幕解析度資訊,以480dip*800dip的 WVGA(density=240)為例:

density=120時

螢幕實際解析度為240px*400px(兩個點對應一個解析度)

狀態列和標題列高各19px或者25dip

橫屏是螢幕寬度400px 或者800dip,工作區域高度211px或者480dip

豎屏時螢幕寬度240px或者480dip,工作區域高度381px或者775dip

 

density=160時

螢幕實際解析度為320px*533px(3個點對應兩個解析度)

狀態列和標題列高個25px或者25dip

橫屏是螢幕寬度533px 或者800dip,工作區域高度295px或者480dip

豎屏時螢幕寬度320px或者480dip,工作區域高度508px或者775dip

 

density=240時

螢幕實際解析度為480px*800px(一個點對於一個解析度)

狀態列和標題列高個38px或者25dip

橫屏是螢幕寬度800px 或者800dip,工作區域高度442px或者480dip

豎屏時螢幕寬度480px或者480dip,工作區域高度762px或者775dip

 

apk的資源套件中

當螢幕density=240時,使用hdpi 標籤的資源

當螢幕density=160時,使用mdpi標籤的資源

當螢幕density=120時,使用ldpi標籤的資源。

不加任何標籤的資源是各種解析度情況下共用的。

布局時盡量使用單位dip,少使用px。

 

dp與px換算公式:

pixs=dips * (densityDpi/160)

dips=(pixs*160)/densityDpi

 

dp與px轉換的方法:

    public static int dipToPx(Contextcontext, float dipValue)
{

       final float scale =context.getResources().getDisplayMetrics().density;

       return (int) (dipValue * scale+ 0.5f);

    }

 

    public static int pxToDip(Contextcontext, float pxValue)
{

       final float scale =context.getResources().getDisplayMetrics().density;

       return (int) (pxValue / scale+ 0.5f);

    }

 

為了使使用者介面能夠在現在和將來的顯示器類型上正常顯示,建議大家始終使用sp作為文字大小的單位,將dip作為其他元素的單位。當然,也可以考慮使用向量圖形,而不是用位元影像。如果
UI 能夠以sp為單位提供設計是最好的,如果設計中沒有sp的概念,則開發人員也可以通過適當的換算取近似值。

與解析度無關的度量單位可以解決這一問題。Android支援下列所有單位。

不經常用的其他單位:

pt:point,磅,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,非常簡單易用;在 Android 中,1pt 大概等於 2.22sp。

in:inches,英寸:長度單位。

Mm:millimeters,毫米:長度單位。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.