Android的單位以及屏幕分辨率詳解
一、常用的單位:相對(duì)單位主要有:px、sp、dp
絕對(duì)單位主要有:pt、in、mm
二、單位應(yīng)用總結(jié):一般用相對(duì)單位,而不是絕對(duì)單位
1、字體的大小一般使用SP,用此單位的字體能夠根據(jù)用戶設(shè)置字體的大小而自動(dòng)縮放
2、空間等相對(duì)距離一般使用dp(dip),隨著密度變化,對(duì)應(yīng)的像素?cái)?shù)量也變化,但并沒有直接的相對(duì)比例的變化。
3、px與實(shí)際像素有關(guān),及與密度有關(guān)!dp和sp和實(shí)際像素沒有關(guān)系,對(duì)于一定分辨率但不同密度的屏幕,px單位的應(yīng)用可能會(huì)導(dǎo)致長(zhǎng)度的相對(duì)比例的變化。
三、密度與分辨率:
密度值表示每英寸有多少個(gè)顯示點(diǎn),與分辨率是兩個(gè)概念。
其屏幕密度標(biāo)準(zhǔn)是:HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120
具體的應(yīng)用運(yùn)算關(guān)系:假設(shè)分辨率是 x*y, 密度為 d, 屏幕實(shí)際大小為 a*b那么關(guān)系為 x*y = d * a * b (約等于)
不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)為例density=120時(shí) 屏幕實(shí)際分辨率為240px*400px (兩個(gè)點(diǎn)對(duì)應(yīng)一個(gè)分辨率)
四、對(duì)比總結(jié):
1、在相同密度(即同一實(shí)體屏幕)不同分辨率的情況下,與實(shí)體密度無(wú)關(guān)的相對(duì)單位sp和dp顯示正常
2、在相同分辨率不同密度的情況下,因?yàn)橐话闱闆r下,都用的標(biāo)準(zhǔn)密度,所以分析的意義不是很大
其他資料:
px:是屏幕的像素點(diǎn)
in:英寸
mm:毫米
pt:磅,1/72 英寸
dp:一個(gè)基于density的抽象單位,如果一個(gè)160dpi的屏幕,1dp=1px
dip:等同于dp
sp:同dp相似,但還會(huì)根據(jù)用戶的字體大小偏好來(lái)縮放。
建議使用sp作為文本的單位,其它用dip
針對(duì)dip和px 的關(guān)系,做以下概述:
HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120
density值表示每英寸有多少個(gè)顯示點(diǎn),與分辨率是兩個(gè)概念。
不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)為例
density=120時(shí) 屏幕實(shí)際分辨率為240px*400px (兩個(gè)點(diǎn)對(duì)應(yīng)一個(gè)分辨率)
狀態(tài)欄和標(biāo)題欄高各19px或者25dip
橫屏是屏幕寬度400px 或者800dip,工作區(qū)域高度211px或者480dip
豎屏?xí)r屏幕寬度240px或者480dip,工作區(qū)域高度381px或者775dip
density=160時(shí) 屏幕實(shí)際分辨率為320px*533px (3個(gè)點(diǎn)對(duì)應(yīng)兩個(gè)分辨率)
狀態(tài)欄和標(biāo)題欄高個(gè)25px或者25dip
橫屏是屏幕寬度533px 或者800dip,工作區(qū)域高度295px或者480dip
豎屏?xí)r屏幕寬度320px或者480dip,工作區(qū)域高度508px或者775dip
density=240時(shí) 屏幕實(shí)際分辨率為480px*800px (一個(gè)點(diǎn)對(duì)于一個(gè)分辨率)
狀態(tài)欄和標(biāo)題欄高個(gè)38px或者25dip
橫屏是屏幕寬度800px 或者800dip,工作區(qū)域高度442px或者480dip
豎屏?xí)r屏幕寬度480px或者480dip,工作區(qū)域高度762px或者775dip
apk的資源包中,當(dāng)屏幕density=240時(shí)使用hdpi 標(biāo)簽的資源
當(dāng)屏幕density=160時(shí),使用mdpi標(biāo)簽的資源
當(dāng)屏幕density=120時(shí),使用ldpi標(biāo)簽的資源。
不加任何標(biāo)簽的資源是各種分辨率情況下共用的。
布局時(shí)盡量使用單位dip,少使用px
下面是幾種不同單位的相互轉(zhuǎn)換.
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);
}
下面說下如何獲取分辨率:
在一個(gè)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)
這還是挺簡(jiǎn)單的, 可是你有沒有在800*480的機(jī)器上試過, 是不是得到的寬度是533 ? 因?yàn)閍ndroid剛開始時(shí)默認(rèn)的density是1.0 , 此時(shí)你可以再manifest.xml中加入
1.uses-sdk節(jié)點(diǎn), <uses-sdk android:minSdkVersion="4" /> , 表示不sdk1.6以下的機(jī)器不能安裝你的apk了.
2.supports-screens 節(jié)點(diǎn).
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />
相關(guān)文章
Listview加載的性能優(yōu)化是如何實(shí)現(xiàn)的
在android開發(fā)中Listview是一個(gè)很重要的組件,它以列表的形式根據(jù)數(shù)據(jù)的長(zhǎng)自適應(yīng)展示具體內(nèi)容,用戶可以自由的定義listview每一列的布局,接下來(lái)通過本文給大家介紹Listview加載的性能優(yōu)化是如何實(shí)現(xiàn)的,對(duì)listview性能優(yōu)化相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01Android 添加TextView刪除線(代碼簡(jiǎn)單)
最近接了個(gè)項(xiàng)目,其中有項(xiàng)目需求是這樣的,有這么個(gè)需求,就是一個(gè)產(chǎn)品下有兩個(gè)價(jià)格,一個(gè)是市場(chǎng)價(jià),一個(gè)是銷售價(jià),這時(shí)要把市場(chǎng)價(jià)添加個(gè)刪除線;怎么實(shí)現(xiàn)呢?下面小編給大家分享一段簡(jiǎn)單的代碼實(shí)現(xiàn)Android 添加TextView刪除線2016-02-02android 處理配置變更的實(shí)現(xiàn)方法
這篇文章主要介紹了android 處理配置變更的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07深入探究Android動(dòng)態(tài)代理的原理及用途
動(dòng)態(tài)代理是一種在編程中非常有用的設(shè)計(jì)模式,它允許你在運(yùn)行時(shí)創(chuàng)建一個(gè)代理對(duì)象來(lái)代替原始對(duì)象,以便在方法調(diào)用前后執(zhí)行額外的邏輯,本文將深入探討Android動(dòng)態(tài)代理的原理、用途和實(shí)際示例2023-09-09Android設(shè)置TextView首行縮進(jìn)示例代碼
使用過word的都會(huì)知道,在文字排版的時(shí)候經(jīng)常要設(shè)置首行縮進(jìn),這樣才會(huì)使排版更整齊,那么在Android中當(dāng)需要設(shè)置首行縮進(jìn)的時(shí)候該腫么辦呢,下面一起來(lái)看看。2016-08-08解析Android 8.1平臺(tái)SystemUI 導(dǎo)航欄加載流程
這篇文章主要介紹了Android 8.1平臺(tái)SystemUI 導(dǎo)航欄加載流程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11