Android中關於dip和px以及轉換的總結

我們在頁面佈局的時候,經常會設置容器的長度,但是到底該使用哪個作爲長度的單位而懊惱。在Android中支持的描述大小區域的類型有以下幾種:

px(pixels)——像素:不同的設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。

dip(device independent pixels)——設備獨立像素:這個和設備硬件有關,一般我們爲了支持WCGA、HVGA和QVGA推薦使用這個,不依賴於像素。等同於dp。

sp(scaled pixels—best for text size)——帶比例的像素。

pt(points)——磅:1pt = 1/72英寸

in(inches)——英寸

mm(millimeters)——毫米

到底px和dip有什麼區別呢?

dip != px

主要是針對不同設備而言的。在Density是160的設備上,比如用AVDManager創建的默認模擬器,dip和px是一樣的但是如果同樣的代碼,換到不同Density的設備上,比如換到一個Density是240的設備上,dip和px體現出來的大小就不一樣了。px不管在什麼樣的設備上都是那樣長,但是dip會根據設備變化;WQVGA屏density=120;QVGA屏density=120;HVGA屏density=160;WVGA屏density=240;density值表示每英寸有多少個顯示點,與分辨率是兩個概念。

當屏幕density=240時使用hdpi標籤的資源
當屏幕density=160時,使用mdpi標籤的資源
當屏幕density=120時,使用ldpi標籤的資源。

不加任何標籤的資源是各種分辨率情況下共用的。佈局時儘量使用單位dip,少使用px。

換算公式爲:
pixs =dips * (densityDpi/160)
dips=(pixs*160)/densityDpi


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); 
        } 

如何獲得設備的屏幕分辨率和屏幕密度?

如分辨率爲480*800,密度爲240的設備,方法如下:
  1. DisplayMetrics dm =getResources().getDisplayMetrics();
  2. dm.densityDpi=240
  3. dm.widthPixels=480
  4. dm.heightPixels=800

複製代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章