1. 程式人生 > >淺談android 螢幕適配中 dp和sp的區別

淺談android 螢幕適配中 dp和sp的區別

歡迎轉載 轉載註明出處

關於dp和sp的具體區別 看網上文章少有深入涉及
介於一次面試被問到:sp和dp的關係是什麼?例如一個控制元件寬度為 15dp 或者 15sp 在大部分情況下是一樣的,那什麼情況下不同?
找了半天木有這類文章,最後蒐集各種資源,在這記錄一下;

dp和px的關係:px = dp * (dpi / 160)

Density-independent pixel (dp)獨立畫素密度。標準是160dip.即1dp對應1個pixel,,螢幕密度越大,1dp對應 的畫素點越多。 上面的公式中有個dpi,dpi為DPI是Dots Per Inch(每英寸所列印的點數),也就是當裝置的dpi為160的時候1px=1dp;

sp和dp的關係 :

很多文章只是簡單的介紹說用於顯示文字,但沒有深入研究這個單位的區別,
追到android原始碼,發現系統內部用applyDimension()將所有單位都轉換成px 再處理:
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;
}


所以發現dp和sp的區別在於density和scaledDensity兩個值上;

–變數density,
float型別,display的logic-density。是一個scaling-factor,用在Density-Independent-Pixel單位,一個dip就是一個畫素。
160dpi的screen提供系統display的baseline。
因此,160dpi的screen-density值為1(160/160),120dpi的screen-density值為0.75(120/160)。
screen-1,已知240x320,1.5”x2” ,可以計算出densityDpi等於160。即240/1.5=160,或320/2=160。再通過densityDpi/160計算出density的值1.0。
screen-2,已知320x480,1.5”x2”,可以計算出densityDpi等於240。即320/1.5=240,或480/2=240。再通過densityDpi/160計算出density的值1.5。

–關於scaledDensity
float型別,一個scaling-factor,用於fonts顯示,同density相同的值,除非由於基於font-size上的體驗需要做微調。
–TyuMainApp.getApp().getResources().getDisplayMetrics()物件中的屬性值

總結一下:
dp只跟螢幕的畫素密度有關;
sp和dp很類似但唯一的區別是,Android系統允許使用者自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是“正常”時1sp=1dp=0.00625英寸,而當文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸。類似我們在windows裡調整字型尺寸以後的效果——視窗大小不變,只有文字大小改變。
示例圖:(測試機器 三星note2)
佈局檔案:

<Button
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:text="100dp"
    android:id="@+id/button" />
<Button
    android:layout_width="100sp"
    android:layout_height="wrap_content"
    android:text="100sp  "
    android:id="@+id/button2" />

當系統字型大小設定為正常時:
這裡寫圖片描述這裡寫圖片描述

當系統字型大小設定為微小時:
這裡寫圖片描述這裡寫圖片描述

正文結束
附加一些android螢幕分辨知識做連結
資訊來源:鴻洋大神的部落格
Android 螢幕適配方案
提出用百分比和dp換算來解決關於螢幕適配問題的方案,很有思考價值;
Android AutoLayout全新的適配方式 堪稱適配終結者
提供了一種根據美工圖可以直接寫佈局,不用考慮px和dp換算的方法,福音啊~~~,穩定和效能還有待測試證明;

關於螢幕解析度和密度:
密度值表示每英寸有多少個顯示點,與解析度是兩個概念。
其螢幕密度標準是:HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120
具體的應用運算關係:假設解析度是 x*y, 密度為 d, 螢幕實際大小為 a*b那麼關係為 x*y = d * a * b (約等於)
不同density下螢幕解析度資訊,以480dip*800dip的 WVGA(density=240)為例density=120時 螢幕實際解析度為240px*400px (兩個點對應一個解析度)

解析度對應dpi
dpi(dots per inch,每英寸點數)
HVGA : 320x480
WVGA:800x480
FWVGA:854x480
QHD:960x540
720P:1280x720(標清,standard definition,SD)
1080P:1920x1080(高清,high definition,HD)

mdpi對應HVGA(標準)
hdpi對應WVGA、FWVGA、QHD。
xhdpi對應720P。
xxhdpi對應1080P。