android dpi dip px

本文轉載自:http://blog.csdn.net/zhaokaiqiang1992


mdpi 120dpi~160dpi 
hdpi 160dpi~240dpi 
xhdpi 240dpi~320dpi 
xxhdpi 320dpi~480dpi 
xxxhdpi 480dpi~640dpi 

首先Drawable資源分爲xxhdpi,xhdpi,hdpi,mdpi,ldpi,分別爲超超高密度400dpi(左右),超高密度320dpi,高密度240dpi,中密度160dpi,低密度120dpi。

然後手機的屏幕又分爲FWVGA,WVGA,VGA,HVGA,QVGA,其中

  •     VGA是:Video Graphic Array,顯示標準爲480 x 640;
  •     WVGA是Wide VGA,分辨率爲480 x 800;
  •     FWVGA是Full Wide VGA,分辨率爲:480 x 854;
  •     HVGA是Half VGA,分辨率爲:320 x 480;
  •     QVGA是Quarter VGA,分辨率爲:240 x 320;
  1. xxhdpi:主要存放超超高密度圖片,背景圖:1080 x 1920,Icon:144 x 144,適配機型:谷歌 Nexus 4
  2. xhdpi:主要存放超高密度圖片,背景圖:720 x 1280,Icon:96 x 96,適配機型:小米2等大屏手機
  3. hdpi:主要放高密度圖片:背景圖:480 x 800,Icon:72 x 72,適配機型:WVGA(480 x 800)和FWVGA(480 x 854)
  4. mdpi:主要放中密度圖片:背景圖 :320 x 480,Icon:48 x 48,適配機型:HVGA(320 x 480)
  5. ldpi:主要放低密度圖片:背景圖:240 x 320,Icon:36 x 36,適配機型:QVGA(240 x 320)

分辨率,這個在android平臺上異常麻煩的問題,讓很多新手要崩潰了。今天,我想和分辨率這個傢伙談談。

    首先,什麼是分辨率呢?我們通常說的480*800、1280*720等等,就是所謂的手機屏幕的分辨率。分辨率代表的是整個屏幕上,一共有多少個像素點,也就是在ps或者是其他的圖像編輯軟件中的px的概念。美工在幫我們做高清原型圖的時候,一般會按照多少分辨率來做。這裏提醒一下剛入職的新手,android版本的高清原型圖最好選擇1280*720像素,這樣美工在後期的切圖的時候會比較容易。目前的項目因爲分辨率選擇的是480*800,所以在後期做高分辨率適配的時候,有很多的小圖標需要重做,否則顯示效果很模糊,這無形之中加大了UI設計師的工作量,算是一個教訓吧!

    但是呢,我們開發者在用xml寫界面的時候,可不會直接用px做爲單位,這是因爲在不同的分辨率下面,相同顯示效果的界面上,控件的實際像素並不是一樣的,因此,我們在設置控件大小的時候,一般用的是dip(dp)作爲長度單位,那麼,dip到底是一種什麼單位呢?

    dip是Density independent pixel的縮寫,也就是獨立的像素密度的意思,dip是基於屏幕密度的抽象單位,與設備無關,用於說明與密度無關的尺寸和位置。它是相對於一個160dpi的屏幕來說的,因此1dip對應160dpi屏幕上的1px。

    這裏一定要注意,dip和dpi是截然不同的兩個概念,不要弄混。

    dip指的是一種獨立像素的表示方式,它的計算是在dpi的基礎之上的,也就是說,我們只有在知道dpi是多少之後,才能夠根據不同的dpi,來精確計算我們需要的dip。

    dpi是一種密度單位,是dot per inch的縮寫,也就是每英寸多少個像素點的意思。比如說,我們有一個480*800分辨率的手機,屏幕的物理尺寸是3英寸*5英寸,那麼我們就可以計算出這個手機的是480/3=160dpi,是屬於低分辨率的,那麼在這種分辨率下面,一個dip就相當於1px,怎麼計算呢?當然就是1dip*(160/160)=1px。也就是說,當我們在這種分辨率的手機下,控件的寬度和長度就和設計圖一樣大小就可以,一個dip對應一個px。但是,如果還是相同的分辨率,換成了2英寸*3.3英寸呢?那麼我們就可以先算出手機的密度是480/2=240dpi,是屬於高分辨率的,那麼在這種分辨率下面,一個dip就相當於1.5像素,怎麼計算呢?當然還是1dip*(240/160)=1.5px。

    因此,明白了dip和dpi的關係,我們就可以精確的設定控件的大小。

    具體而言,當屏幕的的分辨率爲320x480時,無論實際的物理尺寸大小,密度都會被設置爲160dpi,也就意味着這個設備上,一行最多可以放置320dp,而對於480x800的設備,只需屏幕尺寸在3寸到4.3寸之間,密度都會被設置爲240dpi,一行同樣可以放置320dp。因此在開發中,用dp作爲單位,只需要設置一次,就可以適配到多個屏幕上。

    現在我們清楚了這兩個名詞之間的關係,那麼,我們在程序中,如何對兩者進行轉換呢?

    下面的代碼,可以幫助我們實現dp到px的轉換

  1.  * 根據手機的分辨率從 dp 的單位 轉成爲 px(像素) 
  2.      */  
  3.     public static int dip2px(Context context, float dpValue) {  
  4.         //獲取當前屏幕密度dpi與基礎密度160dpi的倍數關係,+0.5f是爲了保證轉化成int類型時的數據正確  
  5.         float scale = context.getResources().getDisplayMetrics().density;  
  6.         return (int) (dpValue * scale + 0.5f);  
  7.     }



  1. * 根據手機的分辨率從 px(像素) 的單位 轉成爲 dp 
  2.      */  
  3.     public static int px2dip(Context context, float pxValue) {  
  4.         //獲取當前屏幕密度dpi與基礎密度160dpi的倍數關係,+0.5f是爲了保證轉化成int類型時的數據正確  
  5.         float scale = context.getResources().getDisplayMetrics().density;  
  6.         return (int) (pxValue / scale + 0.5f);  
  7.     }




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