Android屏幕計量單位詳解

    學習Android這麼久,立刻畢業要參加工做了,一直對pxdipspdp這幾個單位概念似懂非懂的,此次由於工做上的須要,網上搜了點資料並整理了下,寫篇日誌以便之後閱讀。

1.px 
pixels)(像素)
是屏幕的物理像素點,與密度相關,密度大了,單位面積上的px會比較多。一般不推薦使用這個。
2.dip
dp(與密度無關的像素)
一個基於density的抽象單位,這個和設備硬件有關,一般在開發中設置一些view的寬高推薦用這個,通常狀況下,在不一樣分辨率,都不會有縮放的感受。在運行時, Android根據使用中的屏幕的實際密度, 透明地處理任何所需dip單位的縮放。
3.sp
(與刻度無關的像素)
dip/dp類似,會根據用戶的字體大小偏好來縮放,主要用於設置字體的大小android

可能不少朋友對dippx 的區別,不是很清楚,包括我本身以前都沒弄清楚,下面簡單討論一下:
首先明確一點:app

HVGAdensity=160QVGAdensity=120工具

WVGAdensity=240WQVGAdensity=120學習

density值表示每英寸有多少個顯示點,與分辨率是兩個概念。字體

dippx的轉換公式: 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);  

    }  

相關文章
相關標籤/搜索