px?: pixels(像素),相應屏幕上的實際像素點。
dip?:device independent pixels,與密度無關的像素,基于屏幕密度的抽象單位。
在每英寸160點的顯示器上。
1dp = 1px ,即1 :1關系。(dp 就是 dip)
sp?: scaled pixels(放大像素).與密度和字體縮放度無關的像素。 主要用于字體顯示best for textsize。因為android設備屏幕雜亂,各種花樣寬度和高度多的不行,加上各種山寨。
當開發出一套layout后。痛苦的事情來了,屏幕適配。
怎樣保證layout在不同分辨率的屏幕下都能正常顯示呢?以下我們來簡單的分析一下android中一些經常使用的單位。
px(像素)是UI設計師在PS中切圖時使用的單位,手機屏幕中也相同有該顯示單位。
dp是android中開發layout時使用的尺寸單位。
sp是開發layout時關于字體的字號單位,在設置字體單位為sp時,字體可隨屏幕尺寸而自己主動拉伸適應。
Android支持五種不同的dpi模式:ldpi、 mdpi、 hdpi、 xhdpi、 xxhdpi
一般地,手機分辨率與所執行的dpi模式是匹配的。也就是會依據屏幕的尺寸載入Res下不同的dpi目錄。
比如 HVGA(320x480像素)的手機屏幕一般在3.5英寸左右。執行在mdpi模式下(也有奇葩機子例外)
(這個是ROM控制的。app不能改變)。
當執行在mdpi下時,1dp=1px:也就是說設計師在PS里定義一個item高48px。開發時就會定義該item高48dp;Photoshop中14px大的字體,開發時會定義為14sp。
對于一部WVGA(480x800)手機,通常是執行在hdpi模式下。
當執行在hdpi模式下時,
1dp=1.5px:也就是說設計師在PS里定義一個item高72px。開發時就會定義該item高 48dp;
Photoshop中21px大的字體。開發會定義為14sp。
所以,當你的app須要適配多個dpi模式的時候(比如同一時候適配mdpi與hdpi),若你在WVGA下做設計(或者更高),你須要將各數值都為3的倍數,
并在切圖標注時將全部的數字( /3*2) 換算成dp。這樣開發的同一套layout就能用在兩個不同的dpi模式下,而不是寫兩套layout。
當中的比例:
mdpi與hdpi是2:3的關系
mdpi與 xhdpi是1:2的關系
ldpi與mdpi是3:4的關系
比方我的機子紅米,720 * 1280 的屏幕尺寸,就是執行在xhdpi下的。
一種例外。有些比較山寨的Pad有可能是7英寸屏幕,分辨率為WVGA(480*800)執行在mdpi下。