分辨率,這個在android平臺上異常麻煩的問題,讓很多新手要崩潰了。今天,我想和分辨率這個家伙談談。
首先,什么是分辨率呢?我們通常說的480*800、1280*720等等,就是所謂的手機屏幕的分辨率。分辨率代表的是整個屏幕上,一共有多少個像素點,也就是在ps或者是其他的圖像編輯軟件中的px的概念。美工在幫我們做高清原型圖的時候,一般會按照多少分辨率來做。這里提醒一下剛入職的新手,android版本的高清原型圖最好選擇1280*720像素,這樣美工在后期的切圖的時候會比較容易。目前的項目因為分辨率選擇的是480*800,所以在后期做高分辨率適配的時候,有很多的小圖標需要重做,否則顯示效果很模糊,這無形之中加大了UI設計師的工作量,算是一個教訓吧!
但是呢,我們開發(fā)者在用xml寫界面的時候,可不會直接用px做為單位,這是因為在不同的分辨率下面,相同顯示效果的界面上,控件的實際像素并不是一樣的,因此,我們在設置控件大小的時候,一般用的是dip(dp)作為長度單位,那么,dip到底是一種什么單位呢?
dip是 Density independent pixel的縮寫,也就是獨立的像素密度的意思,dip是 基于屏幕密度的抽象單位,與設備無關,用于說明與密度無關的尺寸和位置。它是相對于一個160dpi的屏幕來說的,因此1dip對應160dpi屏幕上的1px。
這里一定要注意,dip和dpi是截然不同的兩個概念,不要弄混。
dip指的是一種獨立像素的表示方式,它的計算是在dpi的基礎之上的,也就是說,我們只有在知道dpi是多少之后,才能夠根據(jù)不同的dpi,來精確計算我們需要的dip。
dpi是一種密度單位,是 dot per inch的縮寫,也就是每英寸多少個像素點的意思。比如說,我們有一個480*800分辨率的手機,屏幕的物理尺寸是3英寸*5英寸,那么我們就可以計算出這個手機的是480/3=160dpi,是屬于低分辨率的,那么在這種分辨率下面, 一個 dip就 相當于 1 個 px,怎么計算呢?當然就是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。 因此在開發(fā)中,用 dp 作為單位,只需要設置一次,就可以適配到多個屏幕上。
現(xiàn)在我們清楚了這兩個名詞之間的關系,那么,我們在程序中,如何對兩者進行轉換呢?
下面的代碼,可以幫助我們實現(xiàn)dp到px的轉換
<span style="font-size:18px;">/** * 根據(jù)手機的分辨率從 dp 的單位 轉成為 px(像素) */ public static int dip2px(Context context, float dpValue) { //獲取當前屏幕密度dpi與基礎密度160dpi的倍數(shù)關系,+0.5f是為了保證轉化成int類型時的數(shù)據(jù)正確 float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }</span>
我們也可以實現(xiàn)px到dp的轉換
<span style="font-size:18px;">/** * 根據(jù)手機的分辨率從 px(像素) 的單位 轉成為 dp */ public static int px2dip(Context context, float pxValue) { //獲取當前屏幕密度dpi與基礎密度160dpi的倍數(shù)關系,+0.5f是為了保證轉化成int類型時的數(shù)據(jù)正確 float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); }</span>