Android的屏幕多样性支持
原文作者:Google
原文地址:http://developer.android.com/guide/practices/screens_support.html
原文版權(quán):Creative Commons 2.5 Attribution License
譯文作者:Jianan - qinxiandiqi@foxmail.com
版本信息:本文基于2015-10-20版本翻譯
譯文版權(quán):CC BY-NC-ND 4.0,允許復(fù)制轉(zhuǎn)載,但必須保留譯文作者署名及譯文鏈接,不得演繹和用于商業(yè)用途
前言
運(yùn)行Android系統(tǒng)設(shè)備的屏幕尺寸和密度千變?nèi)f化。然而對(duì)于應(yīng)用程序來(lái)說(shuō),Android系統(tǒng)為所有設(shè)備提供了一個(gè)統(tǒng)一的開發(fā)環(huán)境,并且由系統(tǒng)處理了大部分應(yīng)用程序界面與實(shí)際屏幕的適配工作。同時(shí),系統(tǒng)也提供了相應(yīng)的API允許你在特定的屏幕尺寸或屏幕密度上為你的應(yīng)用程序UI做特定的調(diào)整,以便在不同配置的屏幕上優(yōu)化你的UI。例如,你可能需要在平板和手機(jī)上顯示不一樣的UI效果。
盡管系統(tǒng)能夠自動(dòng)將你的應(yīng)用程序UI通過(guò)縮放或重置大小來(lái)適配不同的屏幕,但你仍然需要為你的應(yīng)用程序適配不同尺寸和密度的屏幕做一點(diǎn)優(yōu)化工作。這樣,你才能夠最大程度優(yōu)化不同設(shè)備上的用戶體驗(yàn),讓你的用戶相信你的應(yīng)用就是為他們的設(shè)備設(shè)計(jì)的,而不是通過(guò)簡(jiǎn)單的UI拉伸來(lái)填充他們的設(shè)備屏幕。
通過(guò)本文介紹的方法,你能夠創(chuàng)建一個(gè)顯示正確的應(yīng)用程序,并且簽名打包出一個(gè)在其所有支持的設(shè)備屏幕上都能獲得優(yōu)越用戶體驗(yàn)的apk文件。
注意: 本文所有內(nèi)容都假定你的應(yīng)用程序只支持Android 1.6(API Level 4)或者更高的Android版本。如果你的應(yīng)用程序需要支持Android 1.5或者更低的版本,請(qǐng)先閱讀Strategies for Android 1.5.
另外,要知道從Android 3.2開始引入了很多新的API,這些API能夠讓你為不同屏幕尺寸更好的調(diào)整應(yīng)用程序所使用的layout資源。如果你開發(fā)的應(yīng)用需要針對(duì)平板進(jìn)行優(yōu)化,這些新特性就更加重要。更多的細(xì)節(jié)可以參考下面Declaring Table Layouts for Android 3.2章節(jié)。
屏幕支持概覽(Overview of Screens Support)
本章節(jié)為Android支持多樣屏幕的概述。包括對(duì)本文檔或API中涉及的術(shù)語(yǔ)及概念進(jìn)行介紹說(shuō)明,對(duì)Android系統(tǒng)所支持的屏幕配置屬性的總結(jié),以及API和底層屏幕兼容特性的概述。
2.1 術(shù)語(yǔ)及概念(Terms and concepts)
2.1.1 Screen size(屏幕尺寸)
實(shí)際的物理尺寸,根據(jù)屏幕的對(duì)角線來(lái)測(cè)量。
為了簡(jiǎn)單起見,Android將全部屏幕尺寸歸類成4種通用尺寸:small、normal、large、extra-large。
2.1.2 Screen density(屏幕密度)
指的是屏幕上一個(gè)物理單位區(qū)域中的像素?cái)?shù)量,通常使用dpi(每英寸多少點(diǎn))為單位。例如,相對(duì)于“normal”或者“high”密度的屏幕,在相同物理區(qū)域上“l(fā)ow”密度的屏幕擁有的像素要更少。
為了簡(jiǎn)單起見,Android將全部屏幕密度歸類成6中通用密度:low、medium、high、extra-hight、extra-extra-high、extra-extra-extra-high。
2.1.3 Orientation(屏幕方向)
屏幕的方向是從用戶的視覺角度來(lái)說(shuō)的。屏幕方向不是landscape(橫向)就是portrait(豎向),分別意味著屏幕的寬高比更寬或者更高。注意不單要做不同屏幕的適配,還要做同一個(gè)屏幕不同方向情況下的適配,因?yàn)槿绻脩粼趹?yīng)用程序運(yùn)行的過(guò)程中旋轉(zhuǎn)設(shè)備可能會(huì)引起屏幕方向的改變。
2.1.4 Resolution(分辨率)
表示一塊屏幕上總的物理像素?cái)?shù)量。當(dāng)支持多樣屏幕適配的時(shí)候,應(yīng)用程序不直接使用分辨率,應(yīng)用程序應(yīng)當(dāng)使用上文所說(shuō)的系統(tǒng)通用尺寸和通用密度類別,只需關(guān)心屏幕尺寸和密度就可以了。
2.1.5 Density-independent pixel(dp,密度無(wú)關(guān)的像素)
一種虛擬的像素單位。當(dāng)你在UI的layout資源中定義layout的尺寸或位置的時(shí)候,你應(yīng)當(dāng)使用這種虛擬像素單位。
1個(gè)單位的虛擬像素等于160dpi屏幕上的一個(gè)物理像素點(diǎn),這也是系統(tǒng)將“medium”屏幕密度作為基準(zhǔn)密度的原因。在運(yùn)行的時(shí)候,如果有需要,系統(tǒng)會(huì)基于實(shí)際屏幕的密度對(duì)dp單位進(jìn)行縮放。dp單位和實(shí)際屏幕px像素單位的轉(zhuǎn)換很簡(jiǎn)單:px = dp * (dpi/160)。例如,在240dpi的屏幕上,1dp等于1.5px。當(dāng)你定義應(yīng)用程序UI的時(shí)候,你應(yīng)當(dāng)使用dp來(lái)保證你的UI能夠正確顯示在不同的屏幕上。
2.2 屏幕支持的范圍(Range of screens supported)
從Android 1.6(API Level 4)開始,Android提供了多種屏幕尺寸和密度的支持,以對(duì)應(yīng)不同的設(shè)備屏幕配置。你可以使用系統(tǒng)提供的這些功能針對(duì)每一種屏幕配置優(yōu)化你的應(yīng)用程序界面,確保你的應(yīng)用程序能夠在每一種屏幕上提供最好的用戶體驗(yàn),而不單單只是基本正常顯示。
為了簡(jiǎn)化你為不同屏幕適配用戶界面的工作,Android將實(shí)際的屏幕尺寸和密度歸類為如下:
- 4種通用的尺寸:small,normal,large,xlarge
注意: 從Android 3.2(API Level 13)開始,這些尺寸分類已經(jīng)被棄用,以便于基于可用屏幕寬度來(lái)管理屏幕尺寸這種新技術(shù)的實(shí)現(xiàn)。如果你是為Android 3.2或更高版本的系統(tǒng)開發(fā),請(qǐng)參考下面 Declaring Tablet Layouts for Android 3.2 章節(jié)獲取更多信息。
- 6種通用密度:
- ldpi(low) ~ 120dpi
- mdpi(medium) ~ 160dpi
- hdpi(high) ~ 240dpi
- xhdpi(extra-hight) ~ 320dpi
- xxhdpi(extra-extra-high) ~ 480dpi
- xxxhdpi(extra-extra-extra-high) ~ 640dpi
這些通用尺寸和通用密度全部都是以normal尺寸和mdpi密度作為基準(zhǔn)來(lái)調(diào)整的。之所以使用這個(gè)基準(zhǔn)是因?yàn)檫@是第一部Android設(shè)備T-Mobile G1的屏幕配置,也就是HVGA屏幕(直到Android 1.6之前,這都是Android唯一支持的屏幕配置)。
每一套通用尺寸和通用密度都會(huì)覆蓋一定范圍的真實(shí)屏幕尺寸和密度。例如,兩臺(tái)設(shè)備都要求使用normal尺寸,但實(shí)際上手動(dòng)測(cè)量?jī)膳_(tái)設(shè)備屏幕的真實(shí)尺寸和縱橫比會(huì)稍稍不同。同樣的,兩個(gè)設(shè)備都要求使用hdpi密度,但實(shí)際上兩臺(tái)設(shè)備的像素密度稍稍不同。Android系統(tǒng)會(huì)將這些差異抽象化,因此你可以直接提供通用尺寸或者通用密度的UI,讓系統(tǒng)在有需要的時(shí)候自動(dòng)進(jìn)行校準(zhǔn)。下圖粗略的展示了不同的尺寸和密度與通用尺寸和通用密度的對(duì)應(yīng)關(guān)系:
圖1 真實(shí)尺寸與密度和通用尺寸通用密度對(duì)應(yīng)的大致范圍(注意圖中數(shù)字是不太準(zhǔn)確的)
當(dāng)你為不同的屏幕尺寸設(shè)計(jì)UI的時(shí)候,你會(huì)發(fā)現(xiàn)每一種都有最小的空間值限制。因此,系統(tǒng)對(duì)上面提到的每一種通用屏幕尺寸都定義了相關(guān)聯(lián)的最小解析度。最小的尺寸為1dp,dp是你定義layout的時(shí)候應(yīng)該使用的單位,使用這個(gè)單位才能讓系統(tǒng)處理UI因屏幕密度不同引起的變化。
- xlarge屏幕最小解析度為960dp*720dp
- large屏幕最小解析度為640dp*480dp
- normal屏幕最小解析度為470dp*320dp
- small屏幕最小解析度為426dp*320dp
注意: 這些最小屏幕解析度在Android 3.0之前的版本上并沒有明確定義,因此,你可能會(huì)發(fā)現(xiàn)一些設(shè)備的屏幕尺寸在normal和large之間被錯(cuò)誤歸類了。另外,這些解析度也基于屏幕的物理解析度,所以每臺(tái)設(shè)備都各不相同——例如一部1024*720的平板使用了系統(tǒng)欄后留給應(yīng)用程序的可用空間會(huì)更少,因?yàn)椴糠挚臻g被系統(tǒng)欄占用了。
為不同的屏幕尺寸和屏幕密度優(yōu)化你的應(yīng)用程序UI,你可以為一些通用尺寸和通用密度提供替換的資源。通常情況下,你應(yīng)該為不同尺寸的屏幕提供可替換的layout資源,以及為不同密度的屏幕提供可替換的圖片資源。在運(yùn)行的時(shí)候,系統(tǒng)會(huì)將當(dāng)前設(shè)備的屏幕與通用尺寸或通用密度進(jìn)行對(duì)比,自動(dòng)為你的應(yīng)用程序選擇合適的資源。
你不需要為每一種通用屏幕尺寸和通用屏幕密度的組合都提供一套可替換的資源。系統(tǒng)提供了強(qiáng)大的兼容功能,能夠?qū)⒛愕膽?yīng)用程序渲染到不同設(shè)備屏幕上并處理大部分的問(wèn)題。但前提是你在實(shí)現(xiàn)你的UI時(shí)已經(jīng)使用了相關(guān)的技術(shù),這樣才能使系統(tǒng)優(yōu)雅的調(diào)整UI大小(詳細(xì)請(qǐng)查看下面獨(dú)立密度章節(jié))。
注意: 一臺(tái)設(shè)備的通用屏幕尺寸和通用屏幕密度的特性之間是相互獨(dú)立的。例如,一塊WVGA的high密度屏幕將會(huì)使用normal屏幕尺寸,因?yàn)樗奈锢沓叽缗cT-Mobile G1一樣(第一部Android設(shè)備,也是屏幕配置分類的基準(zhǔn))。另一方面,一塊WVGA的medium密度屏幕將會(huì)使用large屏幕尺寸。盡管它們的解析度是相同的(總像素相同),但是這塊WVGA medium密度的屏幕密度比較低,這意味著它的像素點(diǎn)物理尺寸更大,因此才會(huì)使整塊屏幕比基準(zhǔn)屏幕(normal尺寸的屏幕)更大。
2.3 獨(dú)立的密度(Density independence)
當(dāng)你的應(yīng)用程序?qū)崿F(xiàn)“密度獨(dú)立”時(shí),即使是在不同密度的屏幕上,你的UI元素也將保留同樣的物理尺寸(從用戶的角度來(lái)看)。
保持密度獨(dú)立是一件重要的事情,因?yàn)槿绻麤]有保持密度獨(dú)立,一個(gè)UI元素(例如一個(gè)按鈕)將會(huì)在低密度屏幕上顯示的很大,而在高密度屏幕上顯示的很小。像這樣密度相關(guān)的尺寸如果一改變,就會(huì)導(dǎo)致你的應(yīng)用程序產(chǎn)生布局或者可用性的問(wèn)題。圖2和圖3分別顯示了一個(gè)應(yīng)用程序如果沒有保持密度獨(dú)立和保持密度獨(dú)立的顯示效果。
圖2 沒有支持不同屏幕密度的應(yīng)用程序示例,分別是low、medium和high密度的屏幕效果。
圖3 很好支持不同屏幕密度的應(yīng)用程序示例(也就是密度獨(dú)立),分別是low、medium和high密度的屏幕效果。
Android系統(tǒng)通過(guò)兩種方式來(lái)幫助你的應(yīng)用程序?qū)崿F(xiàn)密度獨(dú)立:
- 系統(tǒng)根據(jù)當(dāng)前屏幕的實(shí)際密度自動(dòng)縮放dp單位到合適的大小
- 在需要的情況下,系統(tǒng)根據(jù)當(dāng)前屏幕的實(shí)際密度自動(dòng)縮放圖片資源到合適的尺寸
在圖2中,TextView和ImageView的尺寸通過(guò)像素(px單位)來(lái)指定,因此這些View的物理尺寸在low密度屏幕上顯示會(huì)變得很大,在high密度屏幕上顯示的很小。這是因?yàn)楸M管它們的屏幕實(shí)際物理尺寸大小一樣,但是high密度的屏幕上每英寸擁有的像素點(diǎn)更多(反過(guò)來(lái)也就是同樣數(shù)量的像素點(diǎn)在high密度屏幕上能夠填充的范圍更少)。由于密度無(wú)關(guān)像素的基準(zhǔn)是medium密度的屏幕,所以在上面兩張圖片中medium密度的屏幕顯示效果是一樣的。對(duì)于low密度和high密度的屏幕,系統(tǒng)會(huì)自動(dòng)分別為dp值的實(shí)際尺寸縮小或放大到合適尺寸。
大多數(shù)情況下,確保你的應(yīng)用程序與密度無(wú)關(guān),你只需要簡(jiǎn)單的將所有l(wèi)ayout中的尺寸值使用dp單位或者“wrap_content”屬性值聲明。這樣系統(tǒng)也才能夠根據(jù)當(dāng)前屏幕的密度選擇合適的縮放因子將圖片資源縮放到合適的尺寸。
然而,從上面的截圖中,你可能已經(jīng)發(fā)現(xiàn)圖片的縮放會(huì)導(dǎo)致圖片模糊或者產(chǎn)生齒距。為了避免這種情況,你需要為不同的密度提供可替換的圖片資源。例如,你應(yīng)該為high密度的屏幕提供高分辨率的圖片,系統(tǒng)會(huì)在high密度屏幕上使用高分辨率的圖片來(lái)縮放,而不是直接使用medium密度的圖片。下面的章節(jié)會(huì)詳細(xì)說(shuō)明如何為不同配置的屏幕提供可替換掉的資源。
如何支持多樣屏幕(How to Support Multiple Screens)
Android支持多樣屏幕的基礎(chǔ)是它能夠根據(jù)當(dāng)前屏幕配置適當(dāng)渲染應(yīng)用程序布局和圖片的能力。系統(tǒng)正確處理了每一塊屏幕上的UI渲染工作,這些操作是通過(guò)縮放layout來(lái)適配屏幕尺寸/密度,或者縮放圖片來(lái)適配屏幕密度。為了更好的處理不同屏幕配置之間的差異,你還應(yīng)該做以下工作:
在manifest中明確聲明你的應(yīng)用程序所支持的屏幕尺寸
通過(guò)聲明你的應(yīng)用程序所支持的屏幕尺寸,你可以確保只有符合屏幕配置條件的設(shè)備才能下載你的應(yīng)用程序。聲明所支持的不同屏幕尺寸也會(huì)影響系統(tǒng)如何在更大的屏幕上繪制你的應(yīng)用程序——無(wú)論你的應(yīng)用程序是否運(yùn)行在屏幕兼容模式下。
聲明你的應(yīng)用程序所支持的屏幕尺寸,你需要在manifest文件中聲明<supports-screens>標(biāo)簽。為不同的屏幕尺寸提供不同的layout
默認(rèn)情況下,Android會(huì)調(diào)整應(yīng)用程序的layout大小來(lái)適配當(dāng)前設(shè)備屏幕。在大多數(shù)情況下,這么做沒什么問(wèn)題。然而,在有些情況下,你的UI可能看起來(lái)沒那么好,需要針對(duì)不同屏幕尺寸做一定的調(diào)整。例如,在大屏幕上面,你可能想要調(diào)整一些元素的位置和尺寸來(lái)利用大屏幕多出來(lái)的屏幕空間,或者在小屏幕上你可能需要調(diào)整下尺寸才能讓全部元素都能正確顯示在屏幕上。
提供特定尺寸資源,你可以使用的配置修飾符有small、noraml、large、xlarge。例如,為extra-large屏幕提供的layout資源應(yīng)該放在layout-xlarge/資源文件夾下。
從Android 3.2(API level 13)開始,上面所說(shuō)的尺寸類別已經(jīng)被棄用,你應(yīng)該使用sw<N>dp配置修飾符作為替代品來(lái)定義你的layout資源要求的最小可用寬度。例如,如果你的多窗口平板布局要求最少600dp的屏幕寬度,你就應(yīng)該使用layout-sw600dp/資源文件夾。更多關(guān)于這種聲明layout資源的新技術(shù),請(qǐng)參考下面Declaring Table Layouts for Android 3.2章節(jié)。為不同的屏幕密度提供不同的圖片資源
默認(rèn)情況下,Android會(huì)自動(dòng)縮放你的bitmap圖片(.png,.jpg,和.gif文件)和Nine-Patch圖片(.9.png文件),這樣它們才能在每一臺(tái)設(shè)備上渲染出合適的物理尺寸。例如,如果你的應(yīng)用程序只為基準(zhǔn)密度,也就是medium屏幕密度(mdpi)提供了圖片資源,那么系統(tǒng)將會(huì)在high密度屏幕上放大這些圖片,在low密度屏幕上縮小這些圖片。這些縮放可會(huì)到引起圖片顯示問(wèn)題。為了確保你的圖片看起來(lái)顯示效果最好,你應(yīng)該為不同密度的屏幕提供不同分辨率的圖片進(jìn)行替換。
提供特定密度的資源,你可以使用的配置修飾符(下面章節(jié)詳細(xì)介紹)有l(wèi)dpi(low)、mdpi(medium)、hdpi(high)、xhdpi(extra-high)、xxhdpi(extra-extra-high)、xxxhdpi(extra-extra-extra-high)。例如,想要為high屏幕密度提供的圖片應(yīng)該放在drawable-hdpi/資源文件夾下。
注意: mipmap-xxxhdpi修飾符只有在需要為xxdpi屏幕密度的設(shè)備提供比通常更大的啟動(dòng)圖標(biāo)時(shí)才必須使用的。你不需要為所有圖片都提供xxxdpi規(guī)格的版本。
有些設(shè)備會(huì)將啟動(dòng)圖標(biāo)放大多達(dá)25%。例如,如果你的最高啟動(dòng)圖標(biāo)密度已經(jīng)是extra-extra-hight密度,縮放程序?qū)?huì)使啟動(dòng)圖標(biāo)的顯示效果變得模糊。因此,你應(yīng)該在mipmap-xxxhdpi資源文件夾中提供更高密度的啟動(dòng)圖標(biāo),系統(tǒng)會(huì)直接使用這個(gè)圖標(biāo),而不是去放大低密度版本的圖片。
參考提供xxx-high密度啟動(dòng)圖標(biāo)章節(jié)獲取更多詳細(xì)信息。除了啟動(dòng)圖標(biāo),你不應(yīng)該為其它UI元素提供xxxhdpi類型的圖片。
注意: 將你的啟動(dòng)圖標(biāo)放在res/mipmap-[density]資源文件夾下,而不是res/drawable-[density]資源文件夾。因?yàn)?#xff0c;不管你的應(yīng)用程序?qū)嶋H安裝的設(shè)備屏幕分辨率是多少,Android系統(tǒng)都會(huì)保留這類密度修飾符的資源文件夾,例如mipmap-xxxhdpi。這樣啟動(dòng)器才能夠選擇你的應(yīng)用程序最佳分辨率的圖標(biāo)顯示在home上面。更多關(guān)于mipmap文件夾的信息,請(qǐng)參考Managing Projects Overview
所有的這些尺寸和密度的配置修飾符一一對(duì)應(yīng)上面屏幕支持的范圍(Range of screens supported) 章節(jié)所提到的通用尺寸和通用密度。
注意: 如果你不熟悉這些配置修飾符,以及系統(tǒng)如何使用它們來(lái)適配替換資源,請(qǐng)參考Providing Alternative Resources。
在運(yùn)行的過(guò)程中,系統(tǒng)通過(guò)以下幾個(gè)步驟來(lái)確保UI在當(dāng)前屏幕上能有最好的顯示效果:
系統(tǒng)使用適當(dāng)?shù)目商鎿Q資源
根據(jù)當(dāng)前屏幕的尺寸和密度,系統(tǒng)將使用應(yīng)用程序提供的對(duì)應(yīng)尺寸和密度修飾符資源文件夾中的資源。例如,一臺(tái)high密度的設(shè)備要使用應(yīng)用程序的一張圖片資源,系統(tǒng)將會(huì)在應(yīng)用程序的全部資源文件夾中挑選最匹配當(dāng)前設(shè)備配置的資源文件夾。取決于可用的替代資源,使用hdpi修飾符的資源文件夾(例如drawable-hdpi)可能是最佳的匹配,系統(tǒng)就會(huì)使用這個(gè)文件夾中的圖片資源。
如果沒有找到匹配的可用資源,系統(tǒng)將會(huì)使用默認(rèn)的資源加以放大或縮小來(lái)適配當(dāng)前屏幕尺寸和密度
所謂的默認(rèn)資源文件夾就是那些不帶任何配置修飾符的資源文件夾。例如,drawable/資源文件夾中的資源就是默認(rèn)的圖片資源。系統(tǒng)會(huì)假設(shè)默認(rèn)的資源是根據(jù)屏幕尺寸和密度的基準(zhǔn)來(lái)設(shè)計(jì)的,也就是normal尺寸和medium密度。因此,系統(tǒng)將會(huì)為高密度的屏幕放大默認(rèn)圖片,為低密度屏幕縮小默認(rèn)圖片。
然而,當(dāng)系統(tǒng)查找對(duì)應(yīng)當(dāng)前屏幕的密度修飾符資源但又找不到匹配的資源時(shí),系統(tǒng)不一定就會(huì)使用默認(rèn)的資源。系統(tǒng)也有可能會(huì)使用其它密度修飾符的資源來(lái)作替代,以便放大縮小后能夠取得最好的效果。例如,當(dāng)系統(tǒng)尋找low密度的資源但是又找不到的時(shí)候,系統(tǒng)會(huì)優(yōu)先用high密度的資源進(jìn)行縮小,因?yàn)橄鄬?duì)于使用0.75縮放因子將medium密度資源縮小成low密度資源,系統(tǒng)使用0.5的縮放因子將high密度資源縮小成low密度的資源會(huì)更加容易和節(jié)省開銷。
更多關(guān)于Android系統(tǒng)如何選取帶配置修飾符的可替代資源來(lái)適應(yīng)設(shè)備配置信息,請(qǐng)參考How Android Finds the Best-matching Resource。
3.1 使用配置修飾符(Using configuration qualifiers)
Android支持一系列配置修飾符,通過(guò)這些修飾符,你可以控制系統(tǒng)如何基于當(dāng)前設(shè)備屏幕的特性選擇對(duì)應(yīng)的替代資源。所謂的配置修飾符就是一串字符串,用于附加到你的Android項(xiàng)目資源文件夾后面,以指明該資源文件夾所針對(duì)的配置。
配置修飾符的使用方式:
在你的項(xiàng)目res/文件夾下創(chuàng)建一個(gè)新的文件夾,并以<resources_name>-<qualifiter>格式命名
- <resources_name>指的是標(biāo)準(zhǔn)的資源名稱(例如drawable或者layout)。
- <qualifier>指的是下面表1中的配置修飾符,用于指明文件夾中的資源對(duì)應(yīng)的屏幕配置(例如hdpi或xlarge)
將適當(dāng)?shù)呐渲觅Y源放到對(duì)應(yīng)的資源文件夾中。這些資源的名稱必須與默認(rèn)的資源文件一模一樣。
例如,xlarge是針對(duì)extra-large屏幕的配置修飾符。當(dāng)你將這個(gè)修飾符添加到資源文件夾后面時(shí)(例如layout-xlarge),它向系統(tǒng)指明這些資源應(yīng)該用于extra-large屏幕的設(shè)備。
表1 允許你為不同屏幕配置指定資源的配置修飾符
| 屏幕特性 | 修飾符 | 描述 |
| 尺寸 | small | 針對(duì)small通用屏幕尺寸的資源 |
| normal | 針對(duì)normal通用屏幕尺寸的資源(也是所用尺寸的基準(zhǔn)尺寸) | |
| large | 針對(duì)large通用屏幕尺寸的資源 | |
| xlarge | 針對(duì)extra-large通用屏幕尺寸的資源 | |
| 密度 | ldpi | 針對(duì)low通用屏幕密度(ldpi)的資源(大約120dpi) |
| mdpi | 針對(duì)medium通用屏幕密度(mdpi)的資源(大約160dpi,也是通用屏幕密度的基準(zhǔn)) | |
| hdpi | 針對(duì)high通用屏幕密度(hdpi)的資源(大約240dpi) | |
| xhdpi | 針對(duì)extra-high通用屏幕密度(xhdpi)的資源(大約320dpi) | |
| xxhdpi | 針對(duì)extra-extra-high通用屏幕密度(xxhdpi)的資源(大約480dpi) | |
| xxxhdpi | 針對(duì)extra-extra-extra-high通用屏幕密度的資源(大約640dpi)。只用于存放啟動(dòng)圖標(biāo),詳情請(qǐng)參考上面章節(jié)。 | |
| nodpi | 針對(duì)所有屏幕密度的資源。這些資源與密度無(wú)關(guān),無(wú)論當(dāng)前屏幕密度是多少,系統(tǒng)都不會(huì)放大縮小這些資源。 | |
| tvdpi | 針對(duì)介于mdpi和hdpi之間屏幕密度的資源,大約是213dpi。這不是一個(gè)主要密度類型,它主要是為電視機(jī)屏幕而設(shè)置。大多數(shù)app都不需要這種類型,提供的mdpi和hdpi資源已經(jīng)能夠滿足大部分app的需求,并且在需要的時(shí)候系統(tǒng)也會(huì)自動(dòng)對(duì)這些資源進(jìn)行縮放到合適的大小。如果你需要提供tvdpi類型的資源,你需要使用1.33倍mdpi的縮放因子來(lái)設(shè)置tvdpi資源的大小。例如,一張針對(duì)mdpi屏幕的100x100px圖片,對(duì)應(yīng)tvdpi屏幕的尺寸是133x133px。 | |
| 方向 | land | 針對(duì)橫向屏幕的資源(寬寬高比) |
| port | 針對(duì)豎向屏幕的資源(高寬高比) | |
| 長(zhǎng)寬比 | long | 針對(duì)屏幕的豎屏或?qū)捚灵L(zhǎng)寬比(分別對(duì)應(yīng)豎向或者橫向方向)比基準(zhǔn)屏幕配置更大的屏幕資源 |
| notlong | 針對(duì)屏幕的豎屏或者寬屏長(zhǎng)寬比比基準(zhǔn)屏幕配置更小的屏幕資源 |
注意: 如果你的應(yīng)用程序是為Android 3.2或者更高的系統(tǒng)版本開發(fā)的,那么你需要查看下面Declaring Table Layouts for Android 3.2章節(jié),在定義layout資源的時(shí)候使用新的配置修飾符來(lái)聲明所適配的屏幕尺寸(替換表一中的尺寸修飾符)
更多關(guān)于這些修飾符如何匹配當(dāng)前屏幕實(shí)際尺寸和密度的內(nèi)容,請(qǐng)參考前面屏幕支持范圍(Range of Screens Support) 章節(jié)。
例如,下面的應(yīng)用程序的資源目錄為不同的屏幕尺寸提供了不同的layout資源,為不同的屏幕密度提供了不同的圖片,并使用mipmap/資源文件夾提供啟動(dòng)圖標(biāo):
res/layout/my_layout.xml // layout for normal screen size ("default") res/layout-large/my_layout.xml // layout for large screen size res/layout-xlarge/my_layout.xml // layout for extra-large screen size res/layout-xlarge-land/my_layout.xml // layout for extra-large in landscape orientationres/drawable-mdpi/graphic.png // bitmap for medium-density res/drawable-hdpi/graphic.png // bitmap for high-density res/drawable-xhdpi/graphic.png // bitmap for extra-high-density res/drawable-xxhdpi/graphic.png // bitmap for extra-extra-high-densityres/mipmap-mdpi/my_icon.png // launcher icon for medium-density res/mipmap-hdpi/my_icon.png // launcher icon for high-density res/mipmap-xhdpi/my_icon.png // launcher icon for extra-high-density res/mipmap-xxhdpi/my_icon.png // launcher icon for extra-extra-high-density res/mipmap-xxxhdpi/my_icon.png // launcher icon for extra-extra-extra-high-density更多關(guān)于如何使用可替代資源,以及完整的配置修飾符列表(不單只是屏幕配置修飾符),請(qǐng)參考Providing Alternative Resource.
要注意,系統(tǒng)在運(yùn)行的時(shí)候會(huì)選擇哪一種資源作為“最合適”的資源是根據(jù)一定的邏輯規(guī)則來(lái)決定的。也就是,無(wú)論在哪種屏幕下,你所使用的修飾符都不一定要跟當(dāng)前屏幕配置完全匹配,以便系統(tǒng)能夠自己選擇。具體來(lái)講,當(dāng)基于尺寸修飾符選擇資源的時(shí)候,如果沒有更匹配的資源,系統(tǒng)會(huì)選擇為比當(dāng)前屏幕更小的屏幕所提供的資源(例如,在需要的時(shí)候large尺寸的屏幕可能會(huì)使用normal尺寸的資源)。另外,如果唯一能夠使用的資源是為比當(dāng)前設(shè)備屏幕更大的屏幕所提供的,那么系統(tǒng)將不會(huì)使用這些資源,并且應(yīng)用程序會(huì)崩潰(例如,所有的layout資源都添加了xlarge修飾符,但是當(dāng)前設(shè)備屏幕是normal尺寸屏幕)。更多關(guān)于系統(tǒng)選擇資源的信息,請(qǐng)參考How Android Finds the Best-matching Resource.
小貼士: 如果你有一些圖片資源希望系統(tǒng)永遠(yuǎn)不進(jìn)行縮放(可能你想要在程序運(yùn)行時(shí)由自己來(lái)控制和調(diào)整),那么你應(yīng)該把這些資源放到nodpi配置修飾符的資源文件夾中。在這個(gè)配置修飾符文件夾中的資源是密度無(wú)關(guān)的資源,系統(tǒng)永遠(yuǎn)不會(huì)對(duì)它們進(jìn)行縮放。
3.2 設(shè)計(jì)可替代的布局和圖片資源(Designing alternative layouts and drawables)
需要提供哪些可替代資源是根據(jù)你的應(yīng)用程序需求來(lái)決定的。通常情況下,你需要使用尺寸和方向類的修飾符來(lái)提供可替代的layout資源,以及使用密度類的修飾符提供可替代的圖片資源。
下面章節(jié)將分別總結(jié)為什么你要使用尺寸類或密度類修飾符提供可替代的layout資源或者圖片資源。
3.2.1 可替代布局資源(Alternative layouts)
通常情況下,只要你在不同配置的屏幕上測(cè)試你的應(yīng)用程序,你就能知道是否需要為不同的屏幕尺寸提供可替換的layout資源了。例如:
當(dāng)你在small屏幕上測(cè)試的時(shí)候,你可能會(huì)發(fā)現(xiàn)你的layout不能很好的填充在屏幕上。例如,在small屏幕上,屏幕的寬度內(nèi)不能填滿多個(gè)按鈕。這種情況下,你需要為small屏幕提供可替代的layout資源來(lái)調(diào)整按鈕的尺寸和位置。
當(dāng)你在extra-large屏幕上測(cè)試的時(shí)候,你可能會(huì)發(fā)現(xiàn)你的layout不能高效利用大屏幕的優(yōu)勢(shì),并且整個(gè)布局都被拉伸來(lái)填滿屏幕。這種情況下,你需要為extra-large屏幕提供可替代的layout資源,重新提供為大屏幕(例如平板)優(yōu)化的UI。
盡管你的應(yīng)用程序不為大屏幕提供可替代layout資源也能夠正常運(yùn)行,但對(duì)用戶來(lái)說(shuō),提供可替代資源能讓用戶感覺這個(gè)應(yīng)用程序就是為了他的設(shè)備所設(shè)計(jì)的。如果UI都被拉伸了,用戶對(duì)應(yīng)用程序的用戶體驗(yàn)可能很反感。另外,當(dāng)測(cè)試橫向屏幕與豎向屏幕時(shí),你可能會(huì)發(fā)現(xiàn)豎向屏幕底部的UI元素在橫向屏幕上顯示在屏幕右邊。
總結(jié),你應(yīng)該確認(rèn)你的應(yīng)用程序布局是存在以下幾點(diǎn):
- 需要適配小屏幕(這樣用戶才能正常使用你的應(yīng)用程序)
- 是否有對(duì)大屏幕進(jìn)行優(yōu)化以充分利用大屏幕帶來(lái)的額外空間
- 是否有對(duì)橫向和豎向屏幕進(jìn)行優(yōu)化
如果你的UI所使用的圖片即使在被系統(tǒng)縮放layout之后也要填充整個(gè)view(例如按鈕的背景圖片),那么你應(yīng)該使用Nine-Patch圖片文件。Nine-Patch(點(diǎn)九圖)文件實(shí)際上就是在png圖片文件的基礎(chǔ)上指定了兩個(gè)維度上的可拉伸區(qū)域。當(dāng)系統(tǒng)拉伸使用點(diǎn)九圖的的view時(shí),所使用的點(diǎn)九圖也會(huì)被拉伸,只不過(guò)拉伸的只是點(diǎn)九圖上指定的可拉伸區(qū)域。因此,如果使用點(diǎn)九圖的話就不需要為不同的屏幕尺寸提供不同的圖片,因?yàn)辄c(diǎn)九圖能夠自動(dòng)調(diào)整到任何尺寸。然而,你還是要為不同的屏幕密度提供可替代的點(diǎn)九圖資源。
3.2.2 可替代圖片資源(Alternative drawables)
幾乎每一個(gè)應(yīng)用程序都需要為不同的屏幕密度提供可替代的圖片資源,因?yàn)槊恳粋€(gè)應(yīng)用程序都有一個(gè)啟動(dòng)圖標(biāo),至少要保證這個(gè)啟動(dòng)圖標(biāo)在每一塊屏幕上都有良好的顯示效果。同樣,如果你的應(yīng)用程序中還有其它的圖片(例如菜單圖標(biāo)或者其它圖形),你都應(yīng)該為不同的屏幕密度給每一張圖片都提供可替換的版本。
注意: 你只需要為圖片文件(.png,.jpg或.git)和Nine-Patch文件提供密度相關(guān)的資源。如果你使用XML文件來(lái)定義圖形、顏色或者其它drawable resources,那么你只需要在默認(rèn)的圖片文件夾(drawable/)中保留一份代碼就可以了。
要為不同的屏幕密度創(chuàng)建可替代的圖片資源,你應(yīng)該遵循六種通用屏幕密度圖片的縮放比例3:4:6:8:12:16。例如,如果你有一張為medium屏幕密度設(shè)計(jì)的圖片尺寸是48x48像素,那么其它尺寸應(yīng)該為:
- 36x36(0.75x),low屏幕密度
- 48x48(1.0x 基準(zhǔn)),medium屏幕密度
- 72x72(1.5x),high屏幕密度
- 96x96(2.0x),extra-high屏幕密度
- 180x180(3.0x),extra-extra-high屏幕密度
- 192x192(4.0x),extra-extra-extra-high屏幕密度(只需要啟動(dòng)圖標(biāo),參考上面章節(jié))
圖4 每一種屏幕密度之間圖片的尺寸關(guān)系
更多關(guān)于設(shè)計(jì)圖標(biāo)的信息,請(qǐng)參考Icon Design Guidelines。里面包含了各種圖片資源的尺寸信息,包括啟動(dòng)圖標(biāo)、菜單圖標(biāo),狀態(tài)欄圖標(biāo)、標(biāo)簽圖標(biāo)等等。
為Android 3.2聲明平板布局(Declaring Tablet Layouts for Android 3.2)
自從第一代運(yùn)行Android 3.0系統(tǒng)的平板開始,為平板定義layout的重要方法就是把平板layout放到帶xlarge配置修飾符的資源文件夾中(例如res/layout-xlarge)。為了兼容其它類型的平板以及屏幕尺寸(特別是7英寸的平板),Android 3.2開始引入新的方法來(lái)為更碎片化的屏幕尺寸指定資源。相對(duì)于嘗試將你的layout適配到通用的尺寸(例如large或者xlarge),新的技術(shù)是基于你的layout需要的空間大小(例如寬度要600dp)來(lái)調(diào)整。
這么設(shè)計(jì)的原因是當(dāng)使用通用尺寸為7英寸平板做適配時(shí),事情會(huì)變得非常棘手,因?yàn)?英寸平板在通用尺寸歸類技術(shù)上與5英寸手機(jī)都劃分為同一組(large類型)。盡管這種設(shè)備從尺寸上來(lái)看非常相近,但是對(duì)應(yīng)用程序的UI占用的空間大小來(lái)說(shuō)是顯著不同的,同樣用戶交互習(xí)慣也不同。因此,7英寸和5英寸屏幕不應(yīng)該使用相同的layout資源。為了實(shí)現(xiàn)為這兩種不同的屏幕尺寸提供不同的layout資源,Android現(xiàn)在允許你根據(jù)應(yīng)用程序layout實(shí)際需要的尺寸來(lái)聲明layout資源的類型,并且要使用dp單位。
例如,你在為平板設(shè)備特別設(shè)計(jì)好layout資源之后,應(yīng)該在小于600dp寬度的屏幕上檢查這些layout是否能使用。因?yàn)槭褂眠@些平板layout資源的條件就是屏幕的最小尺寸是否滿足你聲明的尺寸。因此,現(xiàn)在你可以為你的應(yīng)用程序UI指定一些只有在可用寬度最少為600dp時(shí)才能使用的layout資源。
你應(yīng)該在指定一個(gè)寬度的同時(shí),以這個(gè)寬度作為最小尺寸來(lái)進(jìn)行設(shè)計(jì)。否則,你需要在完成layout資源后測(cè)試你的layout能夠支持的最小寬度。
注意: 所有使用新API指定的數(shù)值都是密度無(wú)關(guān)的值(dp),所以你的layout尺寸也應(yīng)該使用dp單位來(lái)定義,因?yàn)槟銘?yīng)該關(guān)心的只是系統(tǒng)計(jì)算屏幕密度后得出來(lái)的可用屏幕空間總值(強(qiáng)烈反對(duì)使用物理像素單位)。更多關(guān)于密度無(wú)關(guān)像素的內(nèi)容,請(qǐng)參考上面術(shù)語(yǔ)與概念(Terms and concepts) 章節(jié)。
4.1 使用新的尺寸修飾符(Using new size qualifiers)
表2總結(jié)了能夠根據(jù)屏幕可用空間大小來(lái)指定資源的配置修飾符。相比較于傳統(tǒng)的通用屏幕尺寸類型(small、normal、large、xlarge),新的修飾符能基于你的應(yīng)用程序支持的屏幕尺寸給你提供更多的控制。
注意: 你使用這些修飾符指定的尺寸不是實(shí)際上的屏幕尺寸。實(shí)際上,這些尺寸是你的Activity窗口可用寬度或者高度的dp值。Android系統(tǒng)可能會(huì)占用一些屏幕空間來(lái)顯示系統(tǒng)UI(例如屏幕底部的系統(tǒng)欄或者頂部的狀態(tài)欄),因此一些屏幕可能無(wú)法使用你的layout資源。也就是說(shuō),你聲明的尺寸應(yīng)該是你的Activity需要的尺寸——系統(tǒng)會(huì)統(tǒng)計(jì)系統(tǒng)UI占用的空間后決定給你的layout提供多大的空間。另外也要注意Action Bar也是你的應(yīng)用程序組成部分,盡管你的layout資源沒有聲明它,但是它同樣要占用你的layout可用空間的一部分,你在設(shè)計(jì)的時(shí)候也要把這部分給計(jì)算進(jìn)去。
表2 新的屏幕尺寸配置修飾符(Android 3.2引入)
| 最小寬度 (smallestWidth) | sw<N>dp 例如:sw600dp、sw720dp | 屏幕的基本尺寸,由屏幕可用區(qū)域的最短尺寸所決定。準(zhǔn)確的說(shuō),設(shè)備的最小寬度就是屏幕最短的可用高度和寬度(你也可以認(rèn)為是屏幕有可能呈現(xiàn)的最短寬度)。你可以使用這個(gè)修飾符來(lái)確保無(wú)論當(dāng)前屏幕的方向如何,你的應(yīng)用程序UI最少可用的寬度都有<N> dp。 例如,你的應(yīng)用程序無(wú)論任何時(shí)候都要求屏幕寬度最少要600dp,那么你就可以使用這個(gè)修飾符創(chuàng)建一個(gè)layout資源并放到res/layout-sw600dp/的資源文件夾中。系統(tǒng)只會(huì)在當(dāng)前屏幕可用最小尺寸為600dp時(shí)才會(huì)使用這個(gè)資源,并且不管這個(gè)600dp是用戶認(rèn)為的高度還是寬度。最小寬度是一個(gè)固定的屏幕尺寸,是屏幕的一個(gè)屬性。無(wú)論當(dāng)前屏幕的方向如何,設(shè)備的最小寬度都是不會(huì)變的。 設(shè)備的最小寬度要考慮到屏幕的裝飾空間和系統(tǒng)UI。例如,如果設(shè)備屏幕有一些持久性的UI沿著最小寬度的軸心占據(jù)一定的空間,那么系統(tǒng)聲明的最小寬度值將會(huì)比實(shí)際屏幕的尺寸小,因?yàn)楸徽紦?jù)的這部分屏幕空間你的UI永遠(yuǎn)無(wú)法使用。 這是相對(duì)于傳統(tǒng)通用尺寸修飾符(small、normal、large、xlarge)的替代方案,它允許你根據(jù)你的UI實(shí)際需要的可用尺寸定義離散的數(shù)值。使用最小寬度來(lái)定義通用尺寸是非常有用的,因?yàn)閷挾韧ǔJ窃O(shè)計(jì)一個(gè)layout的關(guān)鍵因素。一個(gè)UI通常可以上下滑動(dòng),但是卻在橫向空間上無(wú)法擴(kuò)展。可用寬度同時(shí)也是決定是否在手機(jī)上顯示單窗口layout或者平板上顯示多窗口layout的關(guān)鍵因素。因此,你應(yīng)該更加關(guān)注每一種設(shè)備上可能的最小寬度值是多少。 |
| 可用屏幕寬度 (Available screen width) | w<N>dp 例如:w720dp、w1024dp | 通過(guò)<N>值指定該資源文件夾中資源最小可用寬度的dp值。當(dāng)屏幕在橫向和豎向之間切換的時(shí)候,系統(tǒng)相應(yīng)的寬度值會(huì)改變,以實(shí)時(shí)更新你的UI當(dāng)前可用的實(shí)際寬度。 這通常對(duì)判斷是否使用多窗口layout非常有用,因?yàn)楸M管是在平板設(shè)備上,你通常也不希望豎向多窗口布局與橫向的相同。因此,你可以使用這個(gè)修飾符來(lái)聲明layout所需要的最小寬度,而不是同時(shí)使用屏幕尺寸和方向的修飾符來(lái)聯(lián)合聲明。 |
| 可用屏幕高度 (Available screen high) | h<N>dp 例如:h720dp、h1024dp | 通過(guò)<N>值指定該資源文件夾中資源最小可用高度的dp值。當(dāng)屏幕在橫向和豎向之間切換的時(shí)候,系統(tǒng)相應(yīng)的高度值會(huì)改變,以實(shí)時(shí)更新你的UI當(dāng)前可用的實(shí)際高度。 與使用w<N>dp來(lái)定義layout所需寬度一樣,使用h<N>dp來(lái)定義你的layout所需要的高度也是非常有用的,它可以避免使用屏幕尺寸和方向兩種修飾符來(lái)進(jìn)行組合定義。然而,大多數(shù)app不需要這個(gè)修飾符。因?yàn)閁I在需要的時(shí)候一般都能夠上下滑動(dòng),在可用高度的控制上本身就比較靈活,不像可用寬度無(wú)法擴(kuò)展。 |
盡管看起來(lái)使用這些修飾符要比使用通用屏幕尺寸類修飾符更復(fù)雜,但是一旦你確定了你的UI需求,使用這些修飾符實(shí)際上要簡(jiǎn)單得多。當(dāng)你在設(shè)計(jì)UI的時(shí)候,你所關(guān)心的最主要問(wèn)題應(yīng)該是你的應(yīng)用程序在手機(jī)風(fēng)格的UI和平板風(fēng)格的UI(使用多窗口)之間切換時(shí),你所能使用的實(shí)際尺寸。這個(gè)UI風(fēng)格切換的關(guān)鍵點(diǎn)取決于你特定的設(shè)計(jì)——可能你的平板layout需要720dp的寬度,也有可能600dp或者480dp就夠了,還有可能是介于兩者之間的某個(gè)值。使用表二中的修飾符,你就能精確的控制你的layout切換臨界值。
更多關(guān)于這些尺寸配置修飾符的資料,請(qǐng)參考Providing Resource文檔。
4.2 配置實(shí)例(Configuration examples)
為了幫助你針對(duì)不同類型的設(shè)備進(jìn)行設(shè)計(jì),下面是一些典型屏幕寬度的數(shù)值:
- 320dp:一種典型的手機(jī)屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi等等)
- 480dp:像是平板設(shè)備的過(guò)渡線(480x800 mdpi)
- 600dp:一種7英寸平板(600x1024 mdpi)
- 720dp:一種10英寸平板(720x1028 mdpi、800x1280 mdpi等等)
使用表2中的尺寸修飾符,你的應(yīng)用程序可以根據(jù)你想要的寬度(或高度)來(lái)設(shè)定準(zhǔn)確的數(shù)值去促使手機(jī)和平板分別使用不同的layout資源。例如,如果600dp是你的平板layout能夠支持的最小可用寬度值,你就可以提供下面兩套layout資源:
res/layout/main_activity.xml # 手機(jī)使用 res/layout-sw600dp/main_activity.xml # 平板使用在這個(gè)例子中,只有當(dāng)前屏幕空間的最小可用寬度值為600dp時(shí),你的平板layout才能夠被使用。
如果你還想進(jìn)一步自定義你的UI,例如分別為7英寸和10英寸平板設(shè)計(jì)不同的layout,那么你可以再補(bǔ)充額外的最小寬度值layout:
res/layout/main_activity.xml # 手機(jī)使用 (小于600dp的可用寬度) res/layout-sw600dp/main_activity.xml # 7英寸平板使用(600dp或者更大的屏幕寬度) res/layout-sw720dp/main_activity.xml # 10英寸平板使用(720dp或者更大的屏幕寬度)注意上面兩個(gè)例子中的資源所使用的最小寬度修飾符sw<N>dp,它所指的是不管當(dāng)前設(shè)備的方向怎樣,屏幕寬高兩條邊中的最小寬度。因此,使用sw<N>dp從總體上忽略了屏幕的方向并為你的layout指定屏幕的可用尺寸是一種比較方便的方法。
然而,在一些情況下,分辨當(dāng)前可用寬度或者高度對(duì)你的UI非常重要。例如,如果你有一個(gè)內(nèi)置兩個(gè)窗口的layout要顯示兩個(gè)邊靠邊的fragment,你可能就需要根據(jù)當(dāng)前屏幕的寬度是否大于等于600dp,以及是否橫向還是豎向才能決定是否使用這個(gè)layout。這種情況下,你的資源文件應(yīng)該類似下面:
res/layout/main_activity.xml # 手機(jī)使用(可用寬度小于600dp) res/layout-w600dp/main_activity.xml # 多窗口 (任何可用寬度大于等于600dp的屏幕)注意第二套資源使用的可用寬度修飾符是w<N>dp。使用這種方法,有些設(shè)備由于屏幕方向的改變導(dǎo)致兩種layout都會(huì)使用到(例如屏幕在一個(gè)方向上可用寬度至少有600dp,而在另一個(gè)方向可用寬度小于600dp)。
如果可用高度才是你需要關(guān)注的點(diǎn)的話,你同樣也可以與上面一樣使用h<N>dp修飾符。甚至,你還可以聯(lián)合w<N>dp和h<N>dp兩種修飾符一塊使用,如果你真的需要的話。。。
4.3 聲明支持的屏幕尺寸(Declaring screen size support)
一旦你為不同的屏幕尺寸實(shí)現(xiàn)了對(duì)應(yīng)的layout后,在你的manifest文件中聲明你的應(yīng)用程序所支持的屏幕也是同樣重要的。
相對(duì)于新的屏幕配置修飾符,Android 3.2也為manifest的<support-screens> 元素引入了新的屬性。
- android:requiresSmallesWidthDp
聲明支持的最小屏幕寬度。最小寬度指的是屏幕空間(dp單位)上最短的邊能夠給你的應(yīng)用程序最小的可用寬度,換句話說(shuō)就是在屏幕兩條邊上最短的可用邊。因此,為了能讓設(shè)備兼容你的應(yīng)用程序,設(shè)備的最小寬度應(yīng)該等于或者大于聲明的這個(gè)值。(通常聲明的這個(gè)“最小寬度”值指的是你的layout所支持的值,并且不管當(dāng)前屏幕是什么方向。)
例如,如果你的應(yīng)用程序只支持最小可用寬度為600dp的平板設(shè)備:
然而,如果你的應(yīng)用程序支持Android所支持的所有屏幕(比如小到426dpx320dp),那么你可以不用聲明這個(gè)屬性,因?yàn)槟愕膽?yīng)用程序支持的最小寬度已經(jīng)覆蓋了可能遇到的最小設(shè)備了。
慎重: Android系統(tǒng)并不會(huì)注意這個(gè)屬性,因此在運(yùn)行的過(guò)程中這個(gè)屬性并不會(huì)對(duì)應(yīng)用程序的行為產(chǎn)生任何影響。它的作用是在像Google Paly這樣的服務(wù)中過(guò)濾你的應(yīng)用程序。不過(guò),Google Play當(dāng)前并不支持這個(gè)屬性過(guò)濾(在Android 3.2版本上)。因此如果你的應(yīng)用程序不支持小屏幕,你還需要繼續(xù)使用其它關(guān)于尺寸的屬性。
android:compatibleWidthLimitDp
這個(gè)屬性允許你通過(guò)指定你的應(yīng)用程序所支持的最大的“最小寬度”值來(lái)啟用屏幕兼容模式作為一個(gè)可選的功能。如果設(shè)備屏幕的最小邊可用寬度值大于你聲明的值,用戶依然能夠安裝你的應(yīng)用程序,不過(guò)會(huì)在屏幕兼容模式下運(yùn)行。默認(rèn)情況下,屏幕兼容模式是關(guān)閉的,你的layout通常會(huì)被拉伸來(lái)填充屏幕。不過(guò)在系統(tǒng)欄會(huì)有一個(gè)按鈕允許用戶開啟或者關(guān)閉屏幕兼容模式。注意: 如果你的layout能夠在大屏幕上正確的調(diào)整大小,那么你不需要使用這個(gè)屬性。我們建議你避免使用這個(gè)屬性,你應(yīng)該遵從本文檔提到的其它方法來(lái)確保你的layout尺寸能夠適配大屏幕。
android:largestWidthLimitDp
這個(gè)屬性允許你通過(guò)指定你的應(yīng)用程序支持的最大的“最小寬度”值來(lái)強(qiáng)制啟用屏幕兼容模式。如果設(shè)備可用屏幕的最小邊大于你聲明的值,你的應(yīng)用程序?qū)?huì)在屏幕兼容模式下運(yùn)行,并且沒有任何途徑關(guān)閉兼容模式。注意: 如果你的應(yīng)用程序layout能夠在大屏幕上正確調(diào)整大小,那么你不需要使用這個(gè)屬性。我們建議你避免使用這個(gè)屬性,你應(yīng)該遵從本文檔提到的其它方法來(lái)確保你的layout尺寸能夠適配大屏幕。
慎重: 當(dāng)為Android 3.2或者更高版本系統(tǒng)開發(fā)應(yīng)用程序時(shí),你不應(yīng)該使用舊的屏幕尺寸屬性與上面列出的屬性組合使用。同時(shí)組合使用新的屬性和舊的尺寸屬性可能會(huì)導(dǎo)致無(wú)法預(yù)料到到結(jié)果。
更多關(guān)于這些屬性的信息,請(qǐng)參考上面列出的相關(guān)鏈接。
最佳實(shí)踐(Best Practices)
支持多樣屏幕的目的是為了創(chuàng)建能夠正常運(yùn)行,并且在Android支持的通用屏幕設(shè)備上都能顯示良好的應(yīng)用程序。本文前面的章節(jié)闡述了Android如何適配你的應(yīng)用程序到不同的屏幕配置上,以及你可以怎樣為應(yīng)用程序在不同的屏幕配置上定制不同的效果。本章節(jié)主要提供一些額外的小貼士,以及關(guān)于確保你的應(yīng)用程序在不同屏幕配置上都能良好縮放這種技術(shù)的概要。
下面是確保你的應(yīng)用程序能夠在不同屏幕上良好顯示的快速檢查列表:
在XML layout文件中指定尺寸時(shí)要使用wrap_content、fill_parent或者dp單位。
不要在你的應(yīng)用程序代碼中使用固定的像素值。
不要使用AbsoluteLayout(已經(jīng)被廢棄)
為不同的屏幕密度提供可替代的圖片資源。
下面的章節(jié)提供更多的細(xì)節(jié)。
5.1 為layout的尺寸使用wrap_content、fill_content或者dp單位
當(dāng)在XML layout文件中定義view的android:layout_width和android:layout_height時(shí),使用wrap_content、fill_parent或者dp單位來(lái)確保view在當(dāng)前設(shè)備屏幕上能夠分配到一個(gè)合適的尺寸。
例如,一個(gè)view定義了layout_width="100dp",那么它在medium密度屏幕上將有100像素寬,而在high密度的屏幕上系統(tǒng)會(huì)將它放大到150像素寬,這樣view就在屏幕上占據(jù)大約相等物理尺寸。
同樣的,你應(yīng)該使用sp(獨(dú)立尺度像素)單位來(lái)定義字體的尺寸。sp的縮放因子由用戶設(shè)定,系統(tǒng)會(huì)像處理dp一樣縮放這些尺寸。
5.2 不要在應(yīng)用程序的代碼中寫死像素值
出于性能原因以及為了保持代碼的簡(jiǎn)單性,Android系統(tǒng)使用像素作為尺寸和坐標(biāo)值的標(biāo)準(zhǔn)單位。這意味著一個(gè)view的尺寸在代碼中都是用像素單位來(lái)表示,并且基于當(dāng)前屏幕密度而變化。例如,如果myView.getWidth()返回值為10,這表示在當(dāng)前屏幕上myView寬度為10像素,但是在更高密度的屏幕上,這個(gè)返回值可能為15像素。如果你在應(yīng)用程序的代碼中使用像素值來(lái)定義圖片的尺寸,這會(huì)導(dǎo)致圖片無(wú)法根據(jù)當(dāng)前屏幕密度進(jìn)行預(yù)縮放處理,你可能需要在自己的代碼中自行縮放這些像素值來(lái)適配未經(jīng)縮放的原圖。
如果你的應(yīng)用程序需要在運(yùn)行時(shí)操作圖片或者處理像素值,請(qǐng)參考下面Additional Density Consideration章節(jié)。
5.3 不要使用AbsoluteLayout
不像其它的layout控件,AbsoluteLayout強(qiáng)制使用固定的值來(lái)給子view布局,這樣就導(dǎo)致在不同屏幕上很容易出現(xiàn)布局問(wèn)題。因此,AbsoluteLayout在Android 1.5(API Level 3)就給廢棄了。
你應(yīng)該替換使用RelativeLayout,它能夠根據(jù)相對(duì)位置給子view布局。例如,你可以指定一個(gè)按鈕應(yīng)該顯示在一個(gè)TextView的右邊。
5.4 使用尺寸和密度相關(guān)的資源
盡管系統(tǒng)會(huì)根據(jù)當(dāng)前屏幕配置自動(dòng)縮放你的layout和圖片資源,但你可能需要調(diào)整UI在不同屏幕上的尺寸,以及為不同的屏幕密度提供對(duì)應(yīng)的圖片資源。這其實(shí)是重申上面章節(jié)講的內(nèi)容。
如果你需要控制你的應(yīng)用程序在各個(gè)屏幕上的顯示效果,你需要在特定資源文件夾中調(diào)整你的layout和圖片資源。例如,考慮到一個(gè)圖標(biāo)需要在medium和high屏幕密度上顯示,你可以簡(jiǎn)單的創(chuàng)建兩個(gè)不同尺寸的圖標(biāo)(例如medium密度為100x100尺寸,high密度為150x150尺寸),然后分別將這個(gè)兩個(gè)圖標(biāo)放到特定修飾符的資源文件夾中:
res/drawable-mdpi/icon.png //for medium-density screens res/drawable-hdpi/icon.png //for high-density screens注意: 如果一個(gè)資源文件夾的名字沒有定義密度修飾符,那么系統(tǒng)會(huì)認(rèn)為這個(gè)資源文件夾中的資源是為medium這個(gè)密度基準(zhǔn)而設(shè)計(jì)的,并且在需要的情況下會(huì)為其它密度縮放這些資源。
更多關(guān)于有效配置修飾符的內(nèi)容,請(qǐng)參考上面使用配置修飾符(Using configuration qualifiers)章節(jié)。
其它密度注意事項(xiàng)(Additional Density Considerations)
本章節(jié)將闡述更多關(guān)于Android如何在不同屏幕密度上縮放圖片資源,以及如何更進(jìn)一步控制圖片在不同密度屏幕上的繪制。本章節(jié)的內(nèi)容對(duì)于大部分應(yīng)用程序來(lái)說(shuō)不是那么重要,除非你的應(yīng)用程序在不同屏幕密度上運(yùn)行遇到問(wèn)題,或者你的應(yīng)用程序需要操作圖形。
為了更好的理解在運(yùn)行過(guò)程中是如何操作圖形來(lái)支持多種密度屏幕,你應(yīng)該先理解系統(tǒng)用于確保正確縮放圖片的途徑:
預(yù)縮放資源(例如圖片資源)
基于當(dāng)前屏幕的密度,系統(tǒng)使用你的應(yīng)用程序提供的指定尺寸或密度修飾符的資源直接顯示。如果提供的資源與當(dāng)前屏幕密度不符合,系統(tǒng)將會(huì)加載默認(rèn)的資源并放大或縮小這些資源來(lái)適配當(dāng)前的屏幕密度。系統(tǒng)會(huì)假設(shè)默認(rèn)的資源(就是那些保存在沒有添加任何配置修飾符資源文件夾中的資源)是為屏幕密度的基準(zhǔn)(mdpi)而設(shè)計(jì)的,除非系統(tǒng)加載的資源是從其它密度修飾符資源文件中加載的。所謂的預(yù)縮放就是系統(tǒng)將圖片大小調(diào)整到適合當(dāng)前屏幕尺寸時(shí)做的處理。 如果你需要獲取預(yù)縮放資源的尺寸,系統(tǒng)返回的將是縮放之后的資源尺寸。例如,一張為mdpi屏幕設(shè)計(jì)的圖片為50x50像素,它將會(huì)在hdpi屏幕上放大到75x75像素(如果沒有對(duì)應(yīng)的hdpi資源替換的話),并且系統(tǒng)返回的尺寸也將是放大后的這個(gè)值。
在一些情況下,你可能不希望Android系統(tǒng)進(jìn)行預(yù)縮放資源處理。避免預(yù)縮放處理最簡(jiǎn)單的方法就是把資源放到nodpi配置修飾符的資源文件夾下。例如:
res/drawable-nodpi/icon.png
當(dāng)系統(tǒng)從這個(gè)文件夾中獲取icon.png資源時(shí),系統(tǒng)會(huì)不根據(jù)當(dāng)前設(shè)備密度對(duì)這張圖片進(jìn)行縮放。
自動(dòng)縮放像素尺寸和位置
應(yīng)用程序可以通過(guò)在manifest文件中設(shè)置android:anyDensity屬性為false,或者在程序代碼中把一張圖片的Bitmap對(duì)象的inScaled屬性設(shè)置為false來(lái)禁用預(yù)縮放處理。在這種情況下,系統(tǒng)將會(huì)在繪制過(guò)程中自動(dòng)縮放絕對(duì)像素位置和像素尺寸。系統(tǒng)通過(guò)這么處理來(lái)保證使用像素定義的屏幕元素與在基準(zhǔn)屏幕密度(mdpi)上顯示的物理尺寸保持大致相同。系統(tǒng)所做的這些縮放處理對(duì)于應(yīng)用程序來(lái)說(shuō)是透明,應(yīng)用程序獲取到的也是縮放后的尺寸,而不是實(shí)際的物理像素尺寸。
例如,假設(shè)一臺(tái)設(shè)備是WVGA high密度的屏幕,它的分辨率為480x800并且與傳統(tǒng)的HVGA屏幕的大小一樣,現(xiàn)在它運(yùn)行一個(gè)禁用預(yù)縮放處理的程序。在這種情況下,當(dāng)應(yīng)用程序請(qǐng)求屏幕尺寸時(shí),系統(tǒng)將會(huì)“欺騙”應(yīng)用程序,返回320x533尺寸(近似mdpi的屏幕密度)。之后,當(dāng)應(yīng)用程序執(zhí)行繪畫操作時(shí),例如廢除一個(gè)位于(10,10)到(100,100)的矩形,系統(tǒng)將會(huì)適當(dāng)轉(zhuǎn)換這個(gè)位置的值,實(shí)際上廢除的區(qū)域?yàn)?15,15)到(150,150)。如果你的應(yīng)用程序需要直接操作圖片的縮放,這個(gè)誤差可能會(huì)導(dǎo)致意想不到的結(jié)果,不過(guò)這是盡可能考慮應(yīng)用程序的性能后得出的一個(gè)合理的方案。如果你遇到這種情況,請(qǐng)參考下面將dp單位轉(zhuǎn)換為像素單位(Converting dp units to pixel units) 。
通常情況下,你不應(yīng)該禁用預(yù)縮放處理。支持多樣屏幕的最好方法是遵從上面如何支持多屏幕(How to Support Multiple Screens) 章節(jié)提及的基本技術(shù)。
如果你的應(yīng)用程序需要操作圖片或者需要通過(guò)其它方式在屏幕上直接與像素進(jìn)行交互,那你可能需要采取額外的步驟來(lái)支持不同的屏幕密度。例如,如果你需要根據(jù)手指在屏幕上劃過(guò)的像素點(diǎn)來(lái)識(shí)別觸摸手勢(shì)并進(jìn)行響應(yīng),你就需要采用適當(dāng)?shù)拿芏葻o(wú)關(guān)像素值來(lái)取代實(shí)際像素值。
6.1 縮放運(yùn)行過(guò)程中創(chuàng)建的Bitmap對(duì)象(Scaling Bitmap objects created at runtime)
如果你的應(yīng)用程序在內(nèi)存中創(chuàng)建一張圖片(一個(gè)Bitmap對(duì)象),默認(rèn)情況下系統(tǒng)會(huì)假設(shè)這張圖片是為medium這個(gè)基準(zhǔn)屏幕密度而設(shè)計(jì)的,并且在渲染的時(shí)候會(huì)自動(dòng)縮放。當(dāng)Bitmap沒有指定密度屬性時(shí),系統(tǒng)會(huì)添加“自動(dòng)縮放”屬性給Bitmap。如果你沒有正確計(jì)算當(dāng)前設(shè)備的屏幕密度并且為Bitmap對(duì)象指定相應(yīng)的密度屬性,自動(dòng)縮放會(huì)跟你沒有提供可替換資源的處理方法一樣縮放這些Bitmap圖片。
為了控制運(yùn)行過(guò)程中創(chuàng)建的Bitmap對(duì)象是否縮放,你可以通過(guò)Bitmap的setDensity()為其指定密度類型,該方法可選參數(shù)值為DisplayMetrics類中定義的常量,例如DENSITY_HIGH或者DENSITY_LOW。
如果你是通過(guò)BitmapFactory從文件或者數(shù)據(jù)流這些數(shù)據(jù)源創(chuàng)建了Bitmap對(duì)象,那么你可以當(dāng)做這個(gè)Bitmap對(duì)象已經(jīng)存在一樣,使用BitmapFactory.Options來(lái)設(shè)置bipmap對(duì)象的屬性,系統(tǒng)通過(guò)這些屬性來(lái)決定如何對(duì)它進(jìn)行縮放。例如,你可以設(shè)置inDensity屬性來(lái)設(shè)置bitmap對(duì)象對(duì)應(yīng)的屏幕密度,以及inScaled屬性來(lái)設(shè)置bitmap是否要通過(guò)縮放來(lái)適配當(dāng)前設(shè)備屏幕密度。
如果你設(shè)置inScaled屬性為false,那么你就禁用了系統(tǒng)可能會(huì)對(duì)bitmap進(jìn)行的預(yù)縮放處理,系統(tǒng)在每次繪制的時(shí)候才對(duì)bitmap自動(dòng)縮放處理。使用自動(dòng)縮放來(lái)取代預(yù)處理會(huì)消耗更多的CPU,不過(guò)可以節(jié)省內(nèi)存。
圖5: 對(duì)比預(yù)縮放和自動(dòng)縮放的bitmap
圖5顯示了在high密度屏幕上分別加載low(120)、medium(160)、high(240)密度的bitmap時(shí),預(yù)處理縮放和自動(dòng)縮放機(jī)制的區(qū)別。可以看出其中的差異是很小的,因?yàn)樗械腷itmap都被縮放到適配當(dāng)前屏幕密度的大小,盡管被縮放的bitmap由于預(yù)縮放處理還是繪制時(shí)自動(dòng)縮放處理而有小小的顯示差異。
注意: 在Android 3.0或更高的系統(tǒng)版本中,由于改進(jìn)了圖形框架,預(yù)縮放或者自動(dòng)縮放的bitmap顯示效果將看不出區(qū)別。
6.2 將dp單位轉(zhuǎn)換為像素單位(Converting dp units to pixel units)
在一些情況,你需要使用dp單位表達(dá)尺寸后再轉(zhuǎn)換為對(duì)應(yīng)的像素單位。試想一下一個(gè)應(yīng)用程序識(shí)別一個(gè)滑動(dòng)或者劃動(dòng)手勢(shì)的要求是手指至少移動(dòng)16像素。在基準(zhǔn)屏幕上要識(shí)別出這個(gè)手勢(shì),用戶至少要滑動(dòng)16 pixels/160dpi,相當(dāng)于一英寸的十分之一(2.5mm)。如果是在high密度的設(shè)備屏幕上,用戶至少要滑動(dòng)16 pixels/240dpi,相當(dāng)于一英寸的十五分之一(1.7mm)。這個(gè)距離必須足夠短,這樣用戶才能感覺這個(gè)應(yīng)用程序很靈敏。
為了解決這個(gè)問(wèn)題,手勢(shì)的觸發(fā)距離必須在代碼中用dp表示,并轉(zhuǎn)換為對(duì)應(yīng)的實(shí)際像素尺寸。例如:
// 用dp單位表示的手勢(shì)觸發(fā)距離 private static final float GESTURE_THRESHOLD_DP = 16.0f;// 獲取屏幕密度 final float scale = getResources().getDisplayMetrics().density; // 基于屏幕密度將dp尺寸轉(zhuǎn)換為px尺寸 mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);// 使用mGestureThreshold作為手勢(shì)距離判定尺寸...其中DisplayMetrics.density屬性是根據(jù)當(dāng)前屏幕密度得出的縮放因子,你必須使用這個(gè)因子轉(zhuǎn)換dp單位和像素單位。在medium密度的屏幕上,DisplayMetrics.density等于1.0;在high密度的屏幕上等于1.5;在extra-high密度的屏幕上等于2.0;在low密度的屏幕上等于0.75。你必須使用這個(gè)因子的數(shù)值乘以dp單位值得出在當(dāng)前屏幕上對(duì)應(yīng)的實(shí)際像素尺寸(額外增加0.5f是為了在強(qiáng)制轉(zhuǎn)換為整數(shù)時(shí)得到較大的整數(shù)值)。更多信息,請(qǐng)參考DisplayMetrics類。
另外,與其隨意為這類事件定義一個(gè)觸發(fā)值,你應(yīng)該使用ViewConfiguration類中的可用方法獲取預(yù)縮放的配置值。
6.3 使用預(yù)縮放配置值(Using pre-scaled configuration values)
你可以使用ViewConfiguration類來(lái)獲取Android系統(tǒng)使用的距離值、速度值、時(shí)間值等等。例如,系統(tǒng)框架識(shí)別滑動(dòng)操作的像素距離值可以使用getScaledTouchSlop()方法獲取:
private static final int GESTURE_THRESHOLD_DP = ViewConfiguration.get(myContext).getScaledTouchSlop();使用ViewConfiguration類中以getScaled開頭的方法返回的像素值,不管當(dāng)前是什么屏幕密度,都保證能正確顯示。
如何在多種多樣的屏幕上測(cè)試你的應(yīng)用程序(How to Test Your Application on Multiple Screens)
在發(fā)布你的應(yīng)用程序之前,你應(yīng)該在所有支持的屏幕尺寸和屏幕密度上進(jìn)行完整測(cè)試。Android SDK中包含了很多你可以使用的仿真模擬器,這些模擬器模擬出了通用屏幕配置的尺寸和密度,而你的應(yīng)用程序很可能就會(huì)在這種環(huán)境中運(yùn)行。你同樣可以修改仿真模擬器的默認(rèn)尺寸、密度和分辨率,以模擬出一些特別屏幕的屬性。使用仿真模擬器和額外的自定義配置就能測(cè)試一些可能的屏幕配置,因此你沒有必要為了測(cè)試你的應(yīng)用程序而去購(gòu)買每一種設(shè)備。
配置應(yīng)用程序多樣屏幕支持性測(cè)試環(huán)境,你需要?jiǎng)?chuàng)建一系列AVD(Android虛擬機(jī)),可以使用默認(rèn)的仿真模擬器或者創(chuàng)建符合你的應(yīng)用程序能夠支持的屏幕尺寸密度的屏幕配置。為此,你可以使用AVD管理器來(lái)創(chuàng)建這些AVD,并通過(guò)圖形界面啟動(dòng)它們。
圖6: 為測(cè)試屏幕支持個(gè)的系列AVD
啟動(dòng)Android SDK管理器,在window平臺(tái)下你可以執(zhí)行Android SDK文件夾下的SDK Manager.exe文件,在其它平臺(tái)上可以執(zhí)行<sdk>/tools/目錄下的android可執(zhí)行文件。圖6展示了選中一個(gè)AVD的AVD管理器,用于測(cè)試各種各樣的屏幕配置。
表3展示了Android SDK提供的各種各樣仿真模擬器,你可以使用這些模擬器來(lái)模擬一些常見的屏幕配置。
表3: Android SDK提供的仿真器及各種屏幕配置(粗體顯示),還有其它一些典型分辨率。
| Small屏幕 | QVGA(240x320) | 480x640 | |
| Normal屏幕 | WQVGA400(240x400) WQVGA432(240x432) | HVGA(320x480) | WVGA800(480x800) WVGA854(480x854) 600x1024 |
| Large屏幕 | WVGA800(480x800)[1] WVGA854(480x854)[1] | WVGA800(480x800)[2] WVGA854(480x854)[2] | |
| Extra-Large屏幕 | 1024x600 | WXGA(1280x800)[3] 1024x768 1280x768 | 1536x1152 1920x1152 1920x1200 |
[1] 模擬這個(gè)配置,在創(chuàng)建AVD的時(shí)候要自定義120的密度,并且選擇WVGA800或者WVGA854的皮膚
[2] 模擬這個(gè)配置,在創(chuàng)建AVD的時(shí)候要自定義160的密度,并且選擇WVGA800或者WVGA854的皮膚
[3] Android 3.0平臺(tái)上才支持這個(gè)皮膚
更多關(guān)于創(chuàng)建和使用AVD測(cè)試應(yīng)用程序的內(nèi)容情況請(qǐng)參考Managing AVDs with AVD Manager。
查看所有支持的屏幕配置激活設(shè)備比例,請(qǐng)參考Screen Sizes and Densities。
我們同樣建議你將模擬器的物理尺寸配置成與真實(shí)設(shè)備尺寸相近后再測(cè)試你的應(yīng)用程序。這樣更容易將模擬結(jié)果與各個(gè)尺寸和密度比較。為此,你需要知道你的計(jì)算機(jī)顯示器大致的dpi密度(例如,一個(gè)30英寸的戴爾顯示器密度大概96dpi)。當(dāng)你從AVD管理器中啟動(dòng)AVD的時(shí)候,你可以在啟動(dòng)選項(xiàng)中指定模擬器的屏幕尺寸和顯示器的dpi,如圖7:
圖7 從AVD管理器中啟動(dòng)AVD時(shí),你可以設(shè)置的尺寸和密度選項(xiàng)
如果你想要在內(nèi)建模擬器皮膚支持的分辨率或密度之外的屏幕上測(cè)試你的應(yīng)用程序,你可以通過(guò)自定義分辨率和密度來(lái)創(chuàng)建一個(gè)AVD。當(dāng)使用AVD管理器創(chuàng)建AVD的時(shí)候不要選擇內(nèi)建的皮膚,自己指定分辨率。
如果你使用命令行啟動(dòng)你的AVD,你可以通過(guò)-scale選項(xiàng)為模擬器指定縮放因子,例如:
emulator -avd <avd_name> -scale 96dpi為了精簡(jiǎn)模擬器的尺寸,你也可以為-scale選項(xiàng)傳遞一個(gè)0.1到3之間的數(shù)值,它代表期望的縮放因子。
更多關(guān)于從命令行創(chuàng)建AVD模擬器的內(nèi)容,請(qǐng)參考Managing AVDs from the Command Line。
總結(jié)
以上是生活随笔為你收集整理的Android的屏幕多样性支持的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [渝粤教育] 同济大学 概率论与数理统计
- 下一篇: 弹幕网站开发(只有前端)