Android的單位以及螢幕解析度詳解

來源:互聯網
上載者:User

一、常用的單位:相對單位主要有:px、sp、dp
絕對單位主要有:pt、in、mm

二、單位應用總結:一般用相對單位,而不是絕對單位
1、字型的大小一般使用SP,用此單位的字型能夠根據使用者佈建字型的大小而自動縮放

2、空間等相對距離一般使用dp(dip),隨著密度變化,對應的像素數量也變化,但並沒有直接的相對比例的變化。

3、px與實際像素有關,及與密度有關!dp和sp和實際像素沒有關係,對於一定解析度但不同密度的螢幕,px單位的應用可能會導致長度的相對比例的變化。

三、密度與解析度:
密度值表示每英寸有多少個顯示點,與解析度是兩個概念。

其螢幕密度標準是:HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120

具體的應用運算關係:假設解析度是 x*y, 密度為 d, 螢幕實際大小為 a*b那麼關係為 x*y = d * a * b (約等於)

不同density下螢幕解析度資訊,以480dip*800dip的 WVGA(density=240)為例density=120時 螢幕實際解析度為240px*400px (兩個點對應一個解析度)

四、對比總結:
1、在相同密度(即同一實體螢幕)不同解析度的情況下,與實體密度無關的相對單位sp和dp顯示正常

2、在相同解析度不同密度的情況下,因為一般情況下,都用的標準密度,所以分析的意義不是很大

其他資料:
px:是螢幕的像素點
in:英寸
mm:毫米
pt:磅,1/72 英寸
dp:一個基於density的抽象單位,如果一個160dpi的螢幕,1dp=1px
dip:等同於dp
sp:同dp相似,但還會根據使用者的字型大小偏好來縮放。
建議使用sp作為文本的單位,其它用dip
針對dip和px 的關係,做以下概述:
HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120
density值表示每英寸有多少個顯示點,與解析度是兩個概念。
不同density下螢幕解析度資訊,以480dip*800dip的 WVGA(density=240)為例

density=120時 螢幕實際解析度為240px*400px (兩個點對應一個解析度)
狀態列和標題列高各19px或者25dip
橫屏是螢幕寬度400px 或者800dip,工作區域高度211px或者480dip
豎屏時螢幕寬度240px或者480dip,工作區域高度381px或者775dip

density=160時 螢幕實際解析度為320px*533px (3個點對應兩個解析度)
狀態列和標題列高個25px或者25dip
橫屏是螢幕寬度533px 或者800dip,工作區域高度295px或者480dip
豎屏時螢幕寬度320px或者480dip,工作區域高度508px或者775dip

density=240時 螢幕實際解析度為480px*800px (一個點對於一個解析度)
狀態列和標題列高個38px或者25dip
橫屏是螢幕寬度800px 或者800dip,工作區域高度442px或者480dip
豎屏時螢幕寬度480px或者480dip,工作區域高度762px或者775dip

apk的資源套件中,當螢幕density=240時使用hdpi 標籤的資源
當螢幕density=160時,使用mdpi標籤的資源
當螢幕density=120時,使用ldpi標籤的資源。
不加任何標籤的資源是各種解析度情況下共用的。
布局時盡量使用單位dip,少使用px

下面是幾種不同單位的相互轉換.

複製代碼 代碼如下:
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.getResource().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
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.getResource().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}


下面說下如何擷取解析度:

在一個Activity的onCreate方法中,寫入如下代碼:

複製代碼 代碼如下:
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels;  // 螢幕寬度(像素)
int height = metric.heightPixels;  // 螢幕高度(像素)
float density = metric.density;  // 螢幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi;  // 螢幕密度DPI(120 / 160 / 240)


這還是挺簡單的, 可是你有沒有在800*480的機器上試過, 是不是得到的寬度是533 ? 因為android剛開始時預設的density是1.0 , 此時你可以再manifest.xml中加入

1.uses-sdk節點, <uses-sdk android:minSdkVersion="4" /> , 表示不sdk1.6以下的機器不能安裝你的apk了.

2.supports-screens 節點.

複製代碼 代碼如下:


<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。