Android 常用解析度單位

Android 常用解析度單位

Android 常用解析度單位

 

資料來源:http://magiclen.org/android-screen/

 

螢幕尺寸(Screen Size)

螢幕尺寸是指螢幕的物理大小,可以直接使用量尺工具來量測,一般會測量螢幕的對角線長度。平常我們說的4吋螢幕、5吋螢幕、7吋螢幕,就是在說螢幕對角線的長度。要注意的是這裡的「吋」是指「英吋」,而不是台灣所使用的「台寸」。一英吋(inch)等於2.54公分(cm),而一台寸等於3.03公分(cm),別被混淆囉!

Android系統上,螢幕尺寸可直接被表示為small、normal、large和xlarge(extra large)。small的螢幕寬和高的長度至少為426dp x 320dp,normal的螢幕寬和高的長度至少為470dp x 320dp,large的螢幕寬和高的長度至少為640dp x 480dp,xlarge的螢幕寬和高的長度至少為960dp x 720dp。「dp」這個單位等一下將會介紹,如果要將這些值換算成對角線長度的話,那麼可以用以下的方式計算:

實寬 = 寬px / dpi = 寬dp / 160 (單位:英吋)
實高 = 寬px / dpi = 寬dp / 160 (單位:英吋)
對角線長度 = ((實寬*實寬) + (實高*實高))0.5 (單位:英吋)

以上式子出現的「dpi」將在之後介紹,而對角線長度的「0.5」次方表示開根號的意思。

Nexus 7 第二代為例,Nexus 7是7吋的平板電腦,它的寬高長度為960dp x 600dp,螢幕尺寸屬於large(高未滿720dp,尚未到達xlarge),解析度為1920px x 1200px,dpi為320。因此Nexus 7的的實寬為6吋,實高為3.75吋,對角線長度大約是7吋。

當然,也可以利用以上的算法,來算出Android螢幕尺寸大概的範圍:

  • §                            small:3.3吋~3.5吋。
  • §                            normal:3.5吋~5吋。
  • §                            large:5吋~7.5吋。
  • §                            xlarge:7.5吋以上。

螢幕密度(Screen Density)DPI與像素(Pixel)

螢幕密度是指在一塊螢幕物理面積中的像素數量,但是通常不以面積而是以長度做計算,常用的單位是DPI(Dots Per Inch),也就是一吋的長度要使用幾個點才連接而成。舉個例子,假設DPI為160,若要填滿一吋x一吋(一平方英吋)的區塊,則需要使用到160×160=25600個點,而不是160個點哦!在這裡所說的「點(Dot)」,就是「像素(Pixel)」,像素是螢幕基本的顯示單位,一個像素只能用來表示一種顏色,螢幕正是由多種顏色不同的像素來顯示出畫面的。

在固定的螢幕尺寸下,螢幕密度愈高,畫面看起來就愈精細。在Android系統上,螢幕密度可以直接被表示為ldpi(low)、mdpi(medium)、hdpi(high)和xhdpi(extra high)。ldpi大約為120dpi,mdpi大約為160dpi,hdpi大約為240dpi,xhdpi大約為320dpi。

螢幕方向(Orientation)

從使用者的角度來看,與使用者身體垂直的方向稱為「寬(Width)」,與身體平行的方向則稱為「高(Height)」。我們將寬比高長的螢幕稱為「橫的」,高比寬長的螢幕稱為「直的」。在Android上,「橫的」螢幕畫面表示成「Landscape」,「直的」螢幕畫面則表示成「Portrait」。

解析度(Resolution)

解析度又稱「分辨率」,用來表示組成一塊平面所需要的像素(Pixel)的數量。例如解析度1920×1200,就表示這個平面的寬需要使用1920個像素來組成,高需要使用1200個像素來組成,因此要填滿這塊平面,必須使用1920×1200=2304000個像素。

常見單位

Android系統中,可以使用多種單位來表示一個長度,以下將區分這些單位的意義與用途。

PX(Pixel)

PX就是表示一個長度所需的像素數量,如果有一個螢幕的解析度是1920×1200,可以直接將其看成1920px x 1200px,表示這個螢幕的寬有1920個像素(或者說是1920個點);高有1200個像素(或者說是1200個點)。如果要算出一個像素的長度的話,可以直接計算DPI的倒數,例如96 dpi,表示一個像素的長度為1/96=0.0104(單位:英吋)。在Android中,為了使程式可以適應各種螢幕,不應該直接使用PX來指定長度。

IN(Inch)

IN就是英吋,不管DPI的大小如何,1in永遠為1英吋,也就是2.54公分,算是一個蠻大的單位。在Android系統中,因為螢幕面板普遍不大,故建議使用下面提到的MM或是PT單位來指定長度。

MM(Millimeter)

MM就是毫米,不管DPI的大小如何,1mm永遠為1毫米。在Android系統中,通常用來進行製作需要固定實際物理長度的畫面,例如一條尺的圖形。若要拿來MM當作文字的長度,可能會太大,難以微調,故建議使用下面提到的PT單位來指定文字長度。

PT(Point)

PT通常用來當作一個文字的長度,不管DPI的大小如何,1pt永遠為1/72英吋(0.01389英吋),也就是說,在DPI為72的情況之下,1pt=1px,如果將DPI提升到96,那麼1pt=1.333px。由此可以看出,固定的pt大小,會隨著DPI改變其使用的像素數量,因此在相同的螢幕尺寸下,即使DPI不同,文字大小也不會有改變。在Android中,如果想要讓文字在各種裝置上都擁有一樣的大小,不會因為原本在5吋螢幕上看文字正常,在其它尺寸螢幕上看文字就變大或變小的話,可以使用PT單位。

DP(Density-independent Pixel)

DPAndroid上最常用長度的單位,不管DPI的大小如何,1dp永遠為1/160英吋(0.00625英吋),1/160其實是mdpi的倒數,也就是說,DP是以mdpi作為基準的。在mdpi的情況下,1dp=1px=1/160in;在hdpi的情況下,1dp=240/160px=1.5px=1.5/240in=1/160in。可以看得出來,固定的dp大小,會隨著DPI改變其使用的像素數量,即使DPI不同,實際的長度也不會有改變。DP和PX的轉換公式如下:

px = dp * (dpi / 160)

dp = px * 160 / dpi

Android中,DP是最小的固定長度單位,非常適合對版面進行細微的調整,如果想固定字體大小的話,也可以使用DP單位。

SP(Scale-independent Pixel)

SP常用來當作文字的長度,基本上SP就是DP(在字型大小100%的時候),但是SP可以再隨著系統的字型大小設定做倍率的縮放。在Android系統中,如果要讓文字大小可以被使用者在系統設定中的字型大小影響,那就使用SP單位指定文字大小吧!

 

importandroid.content.Context;
importandroid.util.DisplayMetrics;
 
publicclass UnitUtil {
 
        publicstatic DisplayMetrics getDisplayMetrics(Context context){
               DisplayMetrics dm = context.getResources().getDisplayMetrics();
               return dm;
        }
 
        publicstaticfloat dp2px(Context context, float dpValue){
               returnMath.round(dpValue * getDisplayMetrics(context).density);
        }
 
        publicstaticfloat px2dp(Context context, float pxValue){
               returnMath.round(pxValue / getDisplayMetrics(context).density);
        }
 
        publicstaticfloat sp2px(Context context, float pxValue){
               returnMath.round(pxValue * getDisplayMetrics(context).scaledDensity);
        }
 
        publicstaticfloat px2sp(Context context, float pxValue){
               returnMath.round(pxValue / getDisplayMetrics(context).scaledDensity);
        }
 
        publicstaticint getScreenWidthPx(Context context){
               return getDisplayMetrics(context).widthPixels;
        }
 
        publicstaticint getScreenHeightPx(Context context){
               return getDisplayMetrics(context).heightPixels;
        }
}

 

 

 


發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *