1.px (pixels)(像素):是螢幕的物理像素點,與密度相關,密度大了,單位面積上的px會比較多。通常不推薦使用這個。
2.dip或dp(與密度無關的像素):一個基於density的抽象單位,這個和裝置硬體有關,通常在開發中設定一些view的寬高推薦用這個,一般情況下,在不同解析度,都不會有縮放的感覺。在運行時, Android根據使用中的螢幕的實際密度, 透明地處理任何所需dip單位的縮放。
3.sp(與刻度無關的像素):同dip/dp相似,會根據使用者的字型大小偏好來縮放,主要用於設定字型的大小。
可能很多朋友對dip和px 的區別,不是很清楚,包括我自己之前都沒弄清楚,下面簡單討論一下:
首先明確一點:
HVGA屏density=160;QVGA屏density=120;
WVGA屏density=240;WQVGA屏density=120
density值表示每英寸有多少個顯示點,與解析度是兩個概念。
dip到px的轉換公式: px = dip * (density / 160)
Android官方定義dip等價於160dpi螢幕下的一個物理像素點, 即1dip=1px。舉例來說, 在 240 dpi 的螢幕上, 1dip 等於 1.5px。
不同density下螢幕解析度資訊,以480dip*800dip的 WVGA(density=240)為例:
1.當density=120時螢幕實際解析度為240px*400px (兩個點對應一個解析度)狀態列和標題列高為19px或者25dip。
橫屏時螢幕寬度為400px或者800dip,工作區域高度211px或者455dip;
豎屏時螢幕寬度為240px或者480dip,工作區域高度381px或者775dip。
2.當density=160時螢幕實際解析度為320px*533px (3個點對應兩個解析度)狀態列和標題列高為25px或者25dip。
橫屏是螢幕寬度533px 或者800dip,工作區域高度295px或者455dip;
豎屏時螢幕寬度320px或者480dip,工作區域高度508px或者775dip。
3.當density=240時螢幕實際解析度為480px*800px (一個點對於一個解析度)狀態列和標題列高為38px或者25dip。
橫屏是螢幕寬度800px 或者800dip,工作區域高度442px或者455dip;
豎屏時螢幕寬度480px或者480dip,工作區域高度762px或者775dip。
在Android的應用程式套件apk中,系統會根據各個裝置的具體情況引用相應的資源檔(註:不加任何標籤的資源是各種解析度情況下共用的):
當螢幕density=240時,使用hdpi標籤的資源;
當螢幕density=160時,使用mdpi標籤的資源;
當螢幕density=120時,使用ldpi標籤的資源。
下面是在manifest中設定app在不同解析度時,是否支援多密度的方法。
...
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
...
附:
系統對螢幕大小和密度分類對照圖 :
表 1. Android SDK中包含的模擬器皮膚的螢幕尺寸和密度,以及其他典型的解析度.
| |
Low density (120), ldpi |
Medium density (160), mdpi |
High density (240), hdpi |
Extra high density (320), xhdpi |
| Small screen |
QVGA (240x320) |
|
480x640 |
|
| Normal screen |
WQVGA400 (240x400) WQVGA432 (240x432) |
HVGA (320x480) |
WVGA800 (480x800) WVGA854 (480x854) 600x1024 |
640x960 |
| Large screen |
WVGA800** (480x800) WVGA854** (480x854) |
WVGA800* (480x800) WVGA854* (480x854) 600x1024 |
|
|
| Extra Large screen |
1024x600 |
WXGA (1280x800)† 1024x768 1280x768 |
1536x1152 1920x1152 1920x1200 |
2048x1536 2560x1536 2560x1600 |
* 要類比此配置, 使用WVGA800 或 WVGA854建立一個AVD, 指定自訂密度160.
** 要類比此配置, 使用WVGA800 或 WVGA854建立一個AVD, 指定自訂密度120.
協助工具輔助類:
import android.content.Context;
public class DensityUtil {
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}