學習Android這麼久,立刻畢業要參加工做了,一直對px、dip、sp、dp這幾個單位概念似懂非懂的,此次由於工做上的須要,網上搜了點資料並整理了下,寫篇日誌以便之後閱讀。
1.px (pixels)(像素):是屏幕的物理像素點,與密度相關,密度大了,單位面積上的px會比較多。一般不推薦使用這個。
2.dip或dp(與密度無關的像素):一個基於density的抽象單位,這個和設備硬件有關,一般在開發中設置一些view的寬高推薦用這個,通常狀況下,在不一樣分辨率,都不會有縮放的感受。在運行時, Android根據使用中的屏幕的實際密度, 透明地處理任何所需dip單位的縮放。
3.sp(與刻度無關的像素):同dip/dp類似,會根據用戶的字體大小偏好來縮放,主要用於設置字體的大小。android
可能不少朋友對dip和px 的區別,不是很清楚,包括我本身以前都沒弄清楚,下面簡單討論一下:
首先明確一點:app
HVGA屏density=160;QVGA屏density=120;工具
WVGA屏density=240;WQVGA屏density=120學習
density值表示每英寸有多少個顯示點,與分辨率是兩個概念。字體
dip到px的轉換公式: px = dip * (density / 160)spa
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中,系統會根據各個設備的具體狀況引用相應的資源文件(注:不加任何標籤的資源是各類分辨率狀況下共用的):orm
當屏幕density=240時,使用hdpi標籤的資源;
當屏幕density=160時,使用mdpi標籤的資源;
當屏幕density=120時,使用ldpi標籤的資源。xml
下面是在manifest中設置app在不一樣分辨率時,是否支持多密度的方法。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />ip
...
</manifest>
附:
系統對屏幕大小和密度分類對照圖 :
表 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);
}
}