Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读
術(shù)語(yǔ)和概念?
屏幕尺寸?
屏幕的物理尺寸,以屏幕的對(duì)角線長(zhǎng)度作為依據(jù)(比如 2.8寸, 3.5寸)。?
簡(jiǎn)而言之, Android把所有的屏幕尺寸簡(jiǎn)化為三大類(lèi):大,正常,和小。?
程序可以針對(duì)這三種尺寸的屏幕提供三種不同的布局方案,然后系統(tǒng)會(huì)負(fù)責(zé)把你的布局方案以合適的方式渲染到對(duì)應(yīng)的屏幕上,這個(gè)過(guò)程是不需要程序員用代碼來(lái)干預(yù)的。
屏幕長(zhǎng)寬比?
屏幕的物理長(zhǎng)度與物理寬度的比例。程序可以為制定長(zhǎng)寬比的屏幕提供制定的素材,只需要用系統(tǒng)提供的資源分類(lèi)符long和 notlong。
分辨率?
屏幕上擁有的像素的總數(shù)。注意,雖然大部分情況下分辨率都被表示為“寬度×長(zhǎng)度”,但分辨率并不意味著屏幕長(zhǎng)寬比。在 Android系統(tǒng)中,程序一般并不直接處理分辨率。
密度?
以屏幕分辨率為基礎(chǔ),沿屏幕長(zhǎng)寬方向排列的像素。?
密度較低的屏幕,在長(zhǎng)和寬方向都只有比較少的像素,而高密度的屏幕通常則會(huì)有很多 ——甚至?xí)浅7浅6唷袼嘏帕性谕粎^(qū)域。屏幕的密度是非常重要的,舉個(gè)例子,長(zhǎng)寬以像素為單位定義的界面元素(比如一個(gè)按鈕),在低密度的屏幕上會(huì) 顯得很大,但在高密度的屏幕上則會(huì)顯得很小。
密度無(wú)關(guān)的像素( DIP )?
指一個(gè)抽象意義上的像素,程序用它來(lái)定義界面元素。它作為一個(gè)與實(shí)際密度無(wú)關(guān)的單位,幫助程序員構(gòu)建一個(gè)布局方案(界面元素的寬度,高度,位置)。?
一個(gè)與密度無(wú)關(guān)的像素,在邏輯尺寸上,與一個(gè)位于像素密度為 160DPI的屏幕上的像素是一致的,這也是Android平臺(tái)所假定的默認(rèn)顯示設(shè)備。在運(yùn)行的時(shí)候,平臺(tái)會(huì)以目標(biāo)屏幕的密度作為基準(zhǔn),“透明地”處理所 有需要的DIP縮放操作。要把密度無(wú)關(guān)像素轉(zhuǎn)換為屏幕像素,可以用這樣一個(gè)簡(jiǎn)單的公式: pixels = dips * (density / 160)。舉個(gè)例子,在 DPI為 240的屏幕上, 1個(gè) DIP等于 1.5個(gè)物理像素。我們強(qiáng)烈推薦你用 DIP來(lái)定義你程序的界面布局,因?yàn)檫@樣可以保證你的 UI在各種分辨率的屏幕上都可以正常顯示。
為了簡(jiǎn)化程序員面在對(duì)各種分辨率時(shí)的困擾,也為了具備各種分辨率的平臺(tái)都可以直接運(yùn)行這些程序, Android平臺(tái)將所有的屏幕以密度和分辨率為分類(lèi)方式,各自分成了三類(lèi):?
·三種主要的尺寸:大,正常,小;?
·三種不同的密度:高( hdpi),中( mdpi)和低( ldpi)。?【DPI是“dot per inch”的縮寫(xiě),每英寸像素?cái)?shù)。】
如果需要的話(huà),程序可以為各種尺寸的屏幕提供不同的資源(主要是布局),也可以為 各種密度的屏幕提供不同的資源(主要是位圖)。除此以外,程序不需要針對(duì)屏幕的尺寸或者密度作出任何額外的處理。在執(zhí)行的時(shí)候,平臺(tái)會(huì)根據(jù)屏幕本身的尺寸 與密度特性,自動(dòng)載入對(duì)應(yīng)的資源,并把它們從邏輯像素( DIP,用于定義界面布局)轉(zhuǎn)換成屏幕上的物理像素。
?
?
關(guān)于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
首先是幾個(gè)基本概念:
1.屏幕尺寸Screen size
即顯示屏幕的實(shí)際大小,按照屏幕的對(duì)角線進(jìn)行測(cè)量。
為簡(jiǎn)單起見(jiàn),Android把所有的屏幕大小分為四種尺寸:小,普通,大,超大(分別對(duì)應(yīng):small, normal, large, and extra large).
應(yīng)用程序可以為這四種尺寸分別提供不同的自定義屏幕布局-平臺(tái)將根據(jù)屏幕實(shí)際尺寸選擇對(duì)應(yīng)布局進(jìn)行渲染,這種選擇對(duì)于程序側(cè)是透明的。
2.屏幕長(zhǎng)寬比Aspect ratio
長(zhǎng)寬比是屏幕的物理寬度與物理高度的比例關(guān)系。應(yīng)用程序可以通過(guò)使用限定的資源來(lái)為指定的長(zhǎng)寬比提供屏幕布局資源。
3.屏幕分辨率Resolution
在屏幕上顯示的物理像素總和。需要注意的是:盡管分辨率通常用寬x高表示,但分辨率并不意味著具體的屏幕長(zhǎng)寬比。
在Andorid系統(tǒng)中,應(yīng)用程序不直接使用分辨率。
4.密度Density
根據(jù)像素分辨率,在屏幕指定物理寬高范圍內(nèi)能顯示的像素?cái)?shù)量。
在同樣的寬高區(qū)域,低密度的顯示屏能顯示的像素較少,而高密度的顯示屏則能顯示更多的像素。
屏幕密度非常重要,因?yàn)槠渌鼦l件不變的情況下,一共寬高固定的UI組件(比如一個(gè)按鈕)在在低密度的顯示屏上顯得很大, 而在高密度顯示屏上看起來(lái)就很小。
為簡(jiǎn)單起見(jiàn),Android把所有的屏幕分辨率也分為四種尺寸:小,普通,大,超大(分別對(duì)應(yīng):small, normal, large, and extra large).
應(yīng)用程序可以為這四種尺寸分別提供不同的資源-平臺(tái)將透明的對(duì)資源進(jìn)行縮放以適配指定的屏幕分辨率。
5.設(shè)備獨(dú)立像素Density-independent pixel (dp)
應(yīng)用程序可以用來(lái)定義UI組件的虛擬像素單元,通過(guò)密度無(wú)關(guān)的方式來(lái)描述布局尺寸和位置。
一個(gè)設(shè)備獨(dú)立像素相當(dāng)于一個(gè)160 dpi屏幕上的物理像素。
在程序運(yùn)行時(shí),系統(tǒng)根據(jù)屏幕的實(shí)際密度透明的處理任何需要縮放的設(shè)備獨(dú)立像素單元,設(shè)備獨(dú)立像素轉(zhuǎn)換成屏幕實(shí)際像素的換算很簡(jiǎn)單:pixels = dps * (density / 160).
例如在240 dpi的屏幕上,1個(gè)設(shè)備獨(dú)立像素等于1.5物理像素.為確保UI組件在不同的屏幕都能合適的展示,強(qiáng)烈建議使用設(shè)備獨(dú)立像素單元來(lái)定義你的應(yīng)用程序UI。
四種屏幕尺寸分類(lèi):: small, normal, large, and xlarge
四種密度分類(lèi): ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
需要注意的是: xhdpi是從??Android???2.2 (API Level 8)才開(kāi)始增加的分類(lèi).
xlarge是從Android 2.3 (API Level 9)才開(kāi)始增加的分類(lèi).
DPI是“dot per inch”的縮寫(xiě),每英寸像素?cái)?shù)。
一般情況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
參考:http://developer.android.com/images/screens_support/screens-ranges.png
兩種獲取屏幕分辨率信息的方法:
DisplayMetrics metrics = new DisplayMetrics();
Display display = activity.getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
//這里得到的像素值是設(shè)備獨(dú)立像素dp
//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 這樣獲得的參數(shù)信息不正確,不要使用這種方式。
不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。這個(gè)得到的寬和高是空的。
private void initResolutionStr(Context context) {if (ApiConfig.getResolutionStr() == null || ApiConfig.getResolutionStr().equals("")) {WindowManager winMgr = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);Display display = winMgr.getDefaultDisplay();int height = display.getHeight();int width = display.getWidth();String resolution = height > width ? height + "x" + width : width + "x" + height;ApiConfig.setResolutionStr(resolution);// densityDpi = 120dpi is ldpi, densityDpi = 160dpi is mdpi,// densityDpi = 240dpi is hdpi, densityDpi = 320dpi is xhdpi DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);int densityDpi = dm.densityDpi;ApiConfig.setDensityDpi(densityDpi);}}
?
?
如果需要為Android pad定制資源文件,則res目錄下的目錄可能為:
drawable
drawable-ldpi
drawable-mdpi
drawable-hdpi
drawable-xhdpi
drawable-nodpi
drawable-nodpi-1024×600
drawable-nodpi-1280×800
drawable-nodpi-800×480
values
values-ldpi
values-mdpi
values-hdpi
values-xhdpi
values-nodpi
values-nodpi-1024×600
values-nodpi-1280×800
values-nodpi-800×480
Android上常見(jiàn)度量單位:
px(像素):屏幕上的點(diǎn),絕對(duì)長(zhǎng)度,與硬件相關(guān)。
in(英寸):長(zhǎng)度單位。
mm(毫米):長(zhǎng)度單位。
pt(磅):1/72英寸,point。
dp(與密度無(wú)關(guān)的像素):一種基于屏幕密度的抽象單位。在每英寸160點(diǎn)的顯示器上,1dp = 1px。
dip:Density-independent pixel,同dp相同。
sp:在dp的基礎(chǔ)上,還與比例無(wú)關(guān),個(gè)人理解為是一個(gè)矢量圖形單位。
引入dp/dip的原因:?
過(guò)去,程序員通常以像素為單位設(shè)計(jì)計(jì)算機(jī)用戶(hù)界面。例如,定義一個(gè)寬度為300像素的表單字段,列之間的間距為5個(gè)像素,圖標(biāo)大小為16×16像素 等。這樣處理的問(wèn)題在于,如果在一個(gè)每英寸點(diǎn)數(shù)(dpi)更高的新顯示器上運(yùn)行該程序,則用戶(hù)界面會(huì)顯得很小。在有些情況下,用戶(hù)界面可能會(huì)小到難以看清 內(nèi)容。與分辨率無(wú)關(guān)的度量單位可以解決這一問(wèn)題。
如何計(jì)算密度(請(qǐng)參照原帖:http://www.devdiv.com/thread-28610-1-1.html);
1.標(biāo)準(zhǔn)是240*320畫(huà)在1.5*2平方inch上。那么像每平方英寸有240*320/(1.5*2)=25600點(diǎn),也就是一平方英寸的像素點(diǎn)為25600,所以dpi取為它的平方根160;如果你的dpi是120,那么它的密度就是0.75.
2.密度不只是與width有關(guān),還與height有關(guān),所以不管width是1.8還是1.3,它的密度都有可能是1;比如width是1.8,只要它 的height是3/1.8的話(huà),如果pixel為240*320的話(huà),它的密度仍舊是1;同樣如果width為1.3,只要它的 height為3/1.3的話(huà),像素點(diǎn)為240*320,則密度也是1.
3.320*480/(1.5*2)得到單位平方英寸的點(diǎn)為51200,所以單位平方英寸是240*320畫(huà)在1.5*2屏幕的2倍。但是這是平方英寸啊,算密度的時(shí)候要開(kāi)平方的啊,所以應(yīng)該是2開(kāi)平方,是1.414吧,大致密度為1.5。
如何做到與密度無(wú)關(guān):
如果屏幕密度為160,這時(shí)dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設(shè)還是3.2寸),而屏 幕密度變成了320。那么原來(lái)TextView的寬度設(shè)成160px,在密度為320的3.2 寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設(shè)置成160dp或160sp的話(huà)。系統(tǒng)會(huì)自動(dòng)將width屬性值設(shè)置成320px的。 也就是160 * 320 / 160。其中320 / 160可稱(chēng)為密度比例因子。也就是說(shuō),如果使用dp和sp,系統(tǒng)會(huì)根據(jù)屏幕密度的變化自動(dòng)進(jìn)行轉(zhuǎn)換。官方文檔總結(jié)的計(jì)算公式為:pixels = dps * (density /160).
附:
? ?? ???傳說(shuō)iPhone/Mac的設(shè)計(jì)從一開(kāi)始就考慮到對(duì)任意分辨率的支持,iOS的所有介面元素用的都已經(jīng)是矢量化了的圖片,UI界面是系統(tǒng)級(jí)別的與密度無(wú)關(guān);而Android雖然支持任意分辨率,但不是系統(tǒng)全局的,求證。
總結(jié)
以上是生活随笔為你收集整理的Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 广东华信金溢信息技术有限公司(Andro
- 下一篇: 基于eclipse创建android的h