Google Analytics

2013年9月4日 星期三

Android-長度單位(px, dp, sp)

  • px (pixel):  就是我們最常用的螢幕解析度(如1024x768, 800x600等解析度單位就是px),是螢幕的實體像素,以RGB螢幕來說,是三原色合成的一個彩色點,就是1 px。

  • 但px單位不被建議使用,因為不同的手機/平板可能具有不同的像素密度,例如同為4吋的手機,有480x320解析度的也有800x480解析度的,前者的像素密度就比較低。若同樣是480x480px的圖片,在不同手機上顯示的實際大小可能不同。 為了說明px像素與螢幕實際大小的關係,需要先了解另一個名詞dpi(dot per inch),其表示在1英吋有幾個點。160dpi就表示1英吋的長度中,會有160個pixel。

    以同樣480px寬度的圖片為例,在120dpi, 160dpi, 240dpi, 320dpi的大小如下表:
    pixel dpi 計算式 實際長度
    480120480/1204.0 英吋
    480160480/1603.0 英吋
    480240480/2402.0 英吋
    480320480/3201.5 英吋
  • dp(另一縮寫為dip, Density-Independent Pixels):  正因為使用像素px為長度單位,會有上述的問題。Android使用了dp的單位,直接翻譯叫"與(像素)密度無關的像素",就是想要有一種數字單位,在不同的dpi手機/平板下,實際長度會一樣。

    讓我們來看看Andoid解決如何這個問題的方法的吧!首先,它將常用的幾個dpi列出來,有ldpi (low)為120dpi, mdpi (medium)為160dpi, hdpi (high)為240dpi, xhdpi (extra high)為320dpi。

    其次,Andoid以mdpi(160dpi)為基礎,定義在160dpi的環境時,1dp=1px,其他的dpi在跟160dpi作乘法的換算。
    dp dpi density pixel 計算式 實際長度
    480120120/160=0.75480*0.75=360360/1203.0 英吋
    480160160/160=1.0480*1.0=480480/1603.0 英吋
    480240240/160=1.5480*1.5=720730/2403.0 英吋
    480320320/160=2.0480*2.0=960960/3203.0 英吋

    所以使用dp為長度單位,可以在不同的dpi手機/平板下,實際長度會一樣(但因為實際的dpi有時會有四捨五入問題,精確的說是"接近")。
  • sp(Scale Independent Pixels):  觀念跟dp一樣,只要用在設定字體大小,但它也可以根據使用者設定的字體大小再作放大縮小。在160dpi的環境時,1sp=1dp=1px。

沒有留言:

張貼留言