多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開源 > 綜合技術(shù) > Android的屏幕多樣性支持

Android的屏幕多樣性支持

來源:程序員人生   發(fā)布時(shí)間:2016-03-23 08:47:06 閱讀次數(shù):2561次

前言




運(yùn)行Android系統(tǒng)裝備的屏幕尺寸和密度千變?nèi)f化。但是對(duì)利用程序來講,Android系統(tǒng)為所有裝備提供了1個(gè)統(tǒng)1的開發(fā)環(huán)境,并且由系統(tǒng)處理了大部份利用程序界面與實(shí)際屏幕的適配工作。同時(shí),系統(tǒng)也提供了相應(yīng)的API允許你在特定的屏幕尺寸或屏幕密度上為你的利用程序UI做特定的調(diào)劑,以便在不同配置的屏幕上優(yōu)化你的UI。例如,你可能需要在平板和手機(jī)上顯示不1樣的UI效果。

雖然系統(tǒng)能夠自動(dòng)將你的利用程序UI通過縮放或重置大小來適配不同的屏幕,但你依然需要為你的利用程序適配不同尺寸和密度的屏幕做1點(diǎn)優(yōu)化工作。這樣,你才能夠最大程度優(yōu)化不同裝備上的用戶體驗(yàn),讓你的用戶相信你的利用就是為他們的裝備設(shè)計(jì)的,而不是通過簡(jiǎn)單的UI拉伸來填充他們的裝備屏幕。

通過本文介紹的方法,你能夠創(chuàng)建1個(gè)顯示正確的利用程序,并且簽名打包出1個(gè)在其所有支持的裝備屏幕上都能取得優(yōu)越用戶體驗(yàn)的apk文件。

注意: 本文所有內(nèi)容都假定你的利用程序只支持Android 1.6(API Level 4)或更高的Android版本。如果你的利用程序需要支持Android 1.5或更低的版本,請(qǐng)先瀏覽Strategies for Android 1.5.

另外,要知道從Android 3.2開始引入了很多新的API,這些API能夠讓你為不同屏幕尺寸更好的調(diào)劑利用程序所使用的layout資源。如果你開發(fā)的利用需要針對(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)行介紹說明,對(duì)Android系統(tǒng)所支持的屏幕配置屬性的總結(jié),和API和底層屏幕兼容特性的概述。

2.1 術(shù)語(yǔ)及概念(Terms and concepts)

2.1.1 Screen size(屏幕尺寸)

實(shí)際的物理尺寸,根據(jù)屏幕的對(duì)角線來丈量。

為了簡(jiǎn)單起見,Android將全部屏幕尺寸歸類成4種通用尺寸:small、normal、large、extra-large。

2.1.2 Screen density(屏幕密度)

指的是屏幕上1個(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(屏幕方向)

屏幕的方向是從用戶的視覺角度來講的。屏幕方向不是landscape(橫向)就是portrait(豎向),分別意味著屏幕的寬高比更寬或更高。注意不單要做不同屏幕的適配,還要做同1個(gè)屏幕不同方向情況下的適配,由于如果用戶在利用程序運(yùn)行的進(jìn)程中旋轉(zhuǎn)裝備可能會(huì)引發(fā)屏幕方向的改變。

2.1.4 Resolution(分辨率)

表示1塊屏幕上總的物理像素?cái)?shù)量。當(dāng)支持多樣屏幕適配的時(shí)候,利用程序不直接使用分辨率,利用程序應(yīng)當(dāng)使用上文所說的系統(tǒng)通用尺寸和通用密度種別,只需關(guān)心屏幕尺寸和密度就能夠了。

2.1.5 Density-independent pixel(dp,密度無關(guān)的像素)

1種虛擬的像素單位。當(dāng)你在UI的layout資源中定義layout的尺寸或位置的時(shí)候,你應(yīng)當(dāng)使用這類虛擬像素單位。

1個(gè)單位的虛擬像素等于160dpi屏幕上的1個(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)你定義利用程序UI的時(shí)候,你應(yīng)當(dāng)使用dp來保證你的UI能夠正確顯示在不同的屏幕上。

2.2 屏幕支持的范圍(Range of screens supported)

從Android 1.6(API Level 4)開始,Android提供了多種屏幕尺寸和密度的支持,以對(duì)應(yīng)不同的裝備屏幕配置。你可使用系統(tǒng)提供的這些功能針對(duì)每種屏幕配置優(yōu)化你的利用程序界面,確保你的利用程序能夠在每種屏幕上提供最好的用戶體驗(yàn),而不單單只是基本正常顯示。

為了簡(jiǎn)化你為不同屏幕適配用戶界面的工作,Android將實(shí)際的屏幕尺寸和密度歸類為以下:


  • 4種通用的尺寸:small,normal,large,xlarge


注意: 從Android 3.2(API Level 13)開始,這些尺寸分類已被棄用,以便于基于可用屏幕寬度來管理屏幕尺寸這類新技術(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)來調(diào)劑的。之所以使用這個(gè)基準(zhǔn)是由于這是第1部Android裝備T-Mobile G1的屏幕配置,也就是HVGA屏幕(直到Android 1.6之前,這都是Android唯1支持的屏幕配置)。

每套通用尺寸和通用密度都會(huì)覆蓋1定范圍的真實(shí)屏幕尺寸和密度。例如,兩臺(tái)裝備都要求使用normal尺寸,但實(shí)際上手動(dòng)丈量?jī)膳_(tái)裝備屏幕的真實(shí)尺寸和縱橫比會(huì)稍略不同。一樣的,兩個(gè)裝備都要求使用hdpi密度,但實(shí)際上兩臺(tái)裝備的像素密度稍略不同。Android系統(tǒng)會(huì)將這些差異抽象化,因此你可以直接提供通用尺寸或通用密度的UI,讓系統(tǒng)在有需要的時(shí)候自動(dòng)進(jìn)行校準(zhǔn)。下圖粗略的展現(xiàn)了不同的尺寸和密度與通用尺寸和通用密度的對(duì)應(yīng)關(guān)系:

通用尺寸和通用密度對(duì)應(yīng)的大致范圍

圖1 真實(shí)尺寸與密度和通用尺寸通用密度對(duì)應(yīng)的大致范圍(注意圖中數(shù)字是不太準(zhǔn)確的)

當(dāng)你為不同的屏幕尺寸設(shè)計(jì)UI的時(shí)候,你會(huì)發(fā)現(xiàn)每種都有最小的空間值限制。因此,系統(tǒng)對(duì)上面提到的每種通用屏幕尺寸都定義了相干聯(lián)的最小解析度。最小的尺寸為1dp,dp是你定義layout的時(shí)候應(yīng)當(dāng)使用的單位,使用這個(gè)單位才能讓系統(tǒng)處理UI因屏幕密度不同引發(fā)的變化。


  • xlarge屏幕最小解析度為960dp*720dp
  • large屏幕最小解析度為640dp*480dp
  • normal屏幕最小解析度為470dp*320dp
  • small屏幕最小解析度為426dp*320dp


注意: 這些最小屏幕解析度在Android 3.0之前的版本上并沒有明肯定義,因此,你可能會(huì)發(fā)現(xiàn)1些裝備的屏幕尺寸在normal和large之間被毛病歸類了。另外,這些解析度也基于屏幕的物理解析度,所以每臺(tái)裝備都各不相同――例如1部1024*720的平板使用了系統(tǒng)欄后留給利用程序的可用空間會(huì)更少,由于部份空間被系統(tǒng)欄占用了。

為不同的屏幕尺寸和屏幕密度優(yōu)化你的利用程序UI,你可以為1些通用尺寸和通用密度提供替換的資源。通常情況下,你應(yīng)當(dāng)為不同尺寸的屏幕提供可替換的layout資源,和為不同密度的屏幕提供可替換的圖片資源。在運(yùn)行的時(shí)候,系統(tǒng)會(huì)將當(dāng)前裝備的屏幕與通用尺寸或通用密度進(jìn)行對(duì)照,自動(dòng)為你的利用程序選擇適合的資源。

你不需要為每種通用屏幕尺寸和通用屏幕密度的組合都提供1套可替換的資源。系統(tǒng)提供了強(qiáng)大的兼容功能,能夠?qū)⒛愕睦贸绦蜾秩镜讲煌b備屏幕上并處理大部份的問題。但條件是你在實(shí)現(xiàn)你的UI時(shí)已使用了相干的技術(shù),這樣才能使系統(tǒng)優(yōu)雅的調(diào)劑UI大?。ㄔ敿?xì)請(qǐng)查看下面獨(dú)立密度章節(jié))。

注意: 1臺(tái)裝備的通用屏幕尺寸和通用屏幕密度的特性之間是相互獨(dú)立的。例如,1塊WVGA的high密度屏幕將會(huì)使用normal屏幕尺寸,由于它的物理尺寸與T-Mobile G11樣(第1部Android裝備,也是屏幕配置分類的基準(zhǔn))。另外一方面,1塊WVGA的medium密度屏幕將會(huì)使用large屏幕尺寸。雖然它們的解析度是相同的(總像素相同),但是這塊WVGA medium密度的屏幕密度比較低,這意味著它的像素點(diǎn)物理尺寸更大,因此才會(huì)使整塊屏幕比基準(zhǔn)屏幕(normal尺寸的屏幕)更大。

2.3 獨(dú)立的密度(Density independence)

當(dāng)你的利用程序?qū)崿F(xiàn)“密度獨(dú)立”時(shí),即便是在不同密度的屏幕上,你的UI元素也將保存一樣的物理尺寸(從用戶的角度來看)。

保持密度獨(dú)立是1件重要的事情,由于如果沒有保持密度獨(dú)立,1個(gè)UI元素(例如1個(gè)按鈕)將會(huì)在低密度屏幕上顯示的很大,而在高密度屏幕上顯示的很小。像這樣密度相干的尺寸如果1改變,就會(huì)致使你的利用程序產(chǎn)生布局或可用性的問題。圖2和圖3分別顯示了1個(gè)利用程序如果沒有保持密度獨(dú)立和保持密度獨(dú)立的顯示效果。

沒有保持密度獨(dú)立效果

圖2 沒有支持不同屏幕密度的利用程序示例,分別是low、medium和high密度的屏幕效果。

保持密度獨(dú)立效果

圖3 很好支持不同屏幕密度的利用程序示例(也就是密度獨(dú)立),分別是low、medium和high密度的屏幕效果。

Android系統(tǒ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的尺寸通過像素(px單位)來指定,因此這些View的物理尺寸在low密度屏幕上顯示會(huì)變得很大,在high密度屏幕上顯示的很小。這是由于雖然它們的屏幕實(shí)際物理尺寸大小1樣,但是high密度的屏幕上每英寸具有的像素點(diǎn)更多(反過來也就是一樣數(shù)量的像素點(diǎn)在high密度屏幕上能夠填充的范圍更少)。由于密度無關(guān)像素的基準(zhǔn)是medium密度的屏幕,所以在上面兩張圖片中medium密度的屏幕顯示效果是1樣的。對(duì)low密度和high密度的屏幕,系統(tǒng)會(huì)自動(dòng)分別為dp值的實(shí)際尺寸縮小或放大到適合尺寸。

大多數(shù)情況下,確保你的利用程序與密度無關(guān),你只需要簡(jiǎn)單的將所有l(wèi)ayout中的尺寸值使用dp單位或“wrap_content”屬性值聲明。這樣系統(tǒng)也才能夠根據(jù)當(dāng)前屏幕的密度選擇適合的縮放因子將圖片資源縮放到適合的尺寸。

但是,從上面的截圖中,你可能已發(fā)現(xiàn)圖片的縮放會(huì)致使圖片模糊或產(chǎn)生齒距。為了不這類情況,你需要為不同的密度提供可替換的圖片資源。例如,你應(yīng)當(dāng)為high密度的屏幕提供高分辨率的圖片,系統(tǒng)會(huì)在high密度屏幕上使用高分辨率的圖片來縮放,而不是直接使用medium密度的圖片。下面的章節(jié)會(huì)詳細(xì)說明如作甚不同配置的屏幕提供可替換掉的資源。


如何支持多樣屏幕(How to Support Multiple Screens)




Android支持多樣屏幕的基礎(chǔ)是它能夠根據(jù)當(dāng)前屏幕配置適當(dāng)渲染利用程序布局和圖片的能力。系統(tǒng)正確處理了每塊屏幕上的UI渲染工作,這些操作是通過縮放layout來適配屏幕尺寸/密度,或縮放圖片來適配屏幕密度。為了更好的處理不同屏幕配置之間的差異,你還應(yīng)當(dāng)做以下工作:


  • 在manifest中明確聲明你的利用程序所支持的屏幕尺寸
    通過聲明你的利用程序所支持的屏幕尺寸,你可以確保只有符合屏幕配置條件的裝備才能下載你的利用程序。聲明所支持的不同屏幕尺寸也會(huì)影響系統(tǒng)如何在更大的屏幕上繪制你的利用程序――不管你的利用程序是不是運(yùn)行在屏幕兼容模式下。
    聲明你的利用程序所支持的屏幕尺寸,你需要在manifest文件中聲明標(biāo)簽。

  • 為不同的屏幕尺寸提供不同的layout
    默許情況下,Android會(huì)調(diào)劑利用程序的layout大小來適配當(dāng)前裝備屏幕。在大多數(shù)情況下,這么做沒甚么問題。但是,在有些情況下,你的UI可能看起來沒那末好,需要針對(duì)不同屏幕尺寸做1定的調(diào)劑。例如,在大屏幕上面,你可能想要調(diào)劑1些元素的位置和尺寸來利用大屏幕多出來的屏幕空間,或在小屏幕上你可能需要調(diào)劑下尺寸才能讓全部元素都能正確顯示在屏幕上。
    提供特定尺寸資源,你可使用的配置修飾符有small、noraml、large、xlarge。例如,為extra-large屏幕提供的layout資源應(yīng)當(dāng)放在layout-xlarge/資源文件夾下。
    從Android 3.2(API level 13)開始,上面所說的尺寸種別已被棄用,你應(yīng)當(dāng)使用swdp配置修飾符作為替換品來定義你的layout資源要求的最小可用寬度。例如,如果你的多窗口平板布局要求最少600dp的屏幕寬度,你就應(yīng)當(dāng)使用layout-sw600dp/資源文件夾。更多關(guān)于這類聲明layout資源的新技術(shù),請(qǐng)參考下面Declaring Table Layouts for Android 3.2章節(jié)。

  • 為不同的屏幕密度提供不同的圖片資源
    默許情況下,Android會(huì)自動(dòng)縮放你的bitmap圖片(.png,.jpg,和.gif文件)和Nine-Patch圖片(.9.png文件),這樣它們才能在每臺(tái)裝備上渲染出適合的物理尺寸。例如,如果你的利用程序只為基準(zhǔn)密度,也就是medium屏幕密度(mdpi)提供了圖片資源,那末系統(tǒng)將會(huì)在high密度屏幕上放大這些圖片,在low密度屏幕上縮小這些圖片。這些縮放可會(huì)到引發(fā)圖片顯示問題。為了確保你的圖片看起來顯示效果最好,你應(yīng)當(dā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)當(dāng)放在drawable-hdpi/資源文件夾下。


注意: mipmap-xxxhdpi修飾符只有在需要為xxdpi屏幕密度的裝備提供比通常更大的啟動(dòng)圖標(biāo)時(shí)才必須使用的。你不需要為所有圖片都提供xxxdpi規(guī)格的版本。

有些裝備會(huì)將啟動(dòng)圖標(biāo)放大多達(dá)25%。例如,如果你的最高啟動(dòng)圖標(biāo)密度已是extra-extra-hight密度,縮放程序?qū)?huì)使啟動(dòng)圖標(biāo)的顯示效果變得模糊。因此,你應(yīng)當(dā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)當(dāng)為其它UI元素提供xxxhdpi類型的圖片。

注意: 將你的啟動(dòng)圖標(biāo)放在res/mipmap-[density]資源文件夾下,而不是res/drawable-[density]資源文件夾。由于,不管你的利用程序?qū)嶋H安裝的裝備屏幕分辨率是多少,Android系統(tǒng)都會(huì)保存這類密度修飾符的資源文件夾,例如mipmap-xxxhdpi。這樣啟動(dòng)器才能夠選擇你的利用程序最好分辨率的圖標(biāo)顯示在home上面。更多關(guān)于mipmap文件夾的信息,請(qǐng)參考Managing Projects Overview

所有的這些尺寸和密度的配置修飾符逐一對(duì)應(yīng)上面屏幕支持的范圍(Range of screens supported) 章節(jié)所提到的通用尺寸和通用密度。

注意: 如果你不熟習(xí)這些配置修飾符,和系統(tǒng)如何使用它們來適配替換資源,請(qǐng)參考Providing Alternative Resources。

在運(yùn)行的進(jìn)程中,系統(tǒng)通過以下幾個(gè)步驟來確保UI在當(dāng)前屏幕上能有最好的顯示效果:


  1. 系統(tǒng)使用適當(dāng)?shù)目商鎿Q資源
    根據(jù)當(dāng)前屏幕的尺寸和密度,系統(tǒng)將使用利用程序提供的對(duì)應(yīng)尺寸和密度修飾符資源文件夾中的資源。例如,1臺(tái)high密度的裝備要使用利用程序的1張圖片資源,系統(tǒng)將會(huì)在利用程序的全部資源文件夾中挑選最匹配當(dāng)前裝備配置的資源文件夾。取決于可用的替換資源,使用hdpi修飾符的資源文件夾(例如drawable-hdpi)多是最好的匹配,系統(tǒng)就會(huì)使用這個(gè)文件夾中的圖片資源。

  2. 如果沒有找到匹配的可用資源,系統(tǒng)將會(huì)使用默許的資源加以放大或縮小來適配當(dāng)前屏幕尺寸和密度
    所謂的默許資源文件夾就是那些不帶任何配置修飾符的資源文件夾。例如,drawable/資源文件夾中的資源就是默許的圖片資源。系統(tǒng)會(huì)假定默許的資源是根據(jù)屏幕尺寸和密度的基準(zhǔn)來設(shè)計(jì)的,也就是normal尺寸和medium密度。因此,系統(tǒng)將會(huì)為高密度的屏幕放大默許圖片,為低密度屏幕縮小默許圖片。
    但是,當(dāng)系統(tǒng)查找對(duì)應(yīng)當(dāng)前屏幕的密度修飾符資源但又找不到匹配的資源時(shí),系統(tǒng)不1定就會(huì)使用默許的資源。系統(tǒng)也有可能會(huì)使用其它密度修飾符的資源來作替換,以便放大縮小后能夠獲得最好的效果。例如,當(dāng)系統(tǒng)尋覓low密度的資源但是又找不到的時(shí)候,系統(tǒng)會(huì)優(yōu)先用high密度的資源進(jìn)行縮小,由于相對(duì)使用0.75縮放因子將medium密度資源縮小成low密度資源,系統(tǒng)使用0.5的縮放因子將high密度資源縮小成low密度的資源會(huì)更加容易和節(jié)省開消。


更多關(guān)于Android系統(tǒng)如何選取帶配置修飾符的可替換資源來適應(yīng)裝備配置信息,請(qǐng)參考How Android Finds the Best-matching Resource。

3.1 使用配置修飾符(Using configuration qualifiers)

Android支持1系列配置修飾符,通過這些修飾符,你可以控制系統(tǒng)如何基于當(dāng)前裝備屏幕的特性選擇對(duì)應(yīng)的替換資源。所謂的配置修飾符就是1串字符串,用于附加到你的Android項(xiàng)目資源文件夾后面,以指明該資源文件夾所針對(duì)的配置。

配置修飾符的使用方式:


  1. 在你的項(xiàng)目res/文件夾下創(chuàng)建1個(gè)新的文件夾,并以-格式命名

    • 指的是標(biāo)準(zhǔn)的資源名稱(例如drawable或layout)。
    • 指的是下面表1中的配置修飾符,用于指明文件夾中的資源對(duì)應(yīng)的屏幕配置(例如hdpi或xlarge)
  2. 將適當(dāng)?shù)呐渲觅Y源放到對(duì)應(yīng)的資源文件夾中。這些資源的名稱必須與默許的資源文件1模1樣。


例如,xlarge是針對(duì)extra-large屏幕的配置修飾符。當(dāng)你將這個(gè)修飾符添加到資源文件夾后面時(shí)(例如layout-xlarge),它向系統(tǒng)指明這些資源應(yīng)當(dāng)用于extra-large屏幕的裝備。

表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ì)所有屏幕密度的資源。這些資源與密度無關(guān),不管當(dāng)前屏幕密度是多少,系統(tǒng)都不會(huì)放大縮小這些資源。
tvdpi 針對(duì)介于mdpi和hdpi之間屏幕密度的資源,大約是213dpi。這不是1個(gè)主要密度類型,它主要是為電視機(jī)屏幕而設(shè)置。大多數(shù)app都不需要這類類型,提供的mdpi和hdpi資源已能夠滿足大部份app的需求,并且在需要的時(shí)候系統(tǒng)也會(huì)自動(dòng)對(duì)這些資源進(jìn)行縮放到適合的大小。如果你需要提供tvdpi類型的資源,你需要使用1.33倍mdpi的縮放因子來設(shè)置tvdpi資源的大小。例如,1張針對(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ì)屏幕的豎屏或?qū)捚灵L(zhǎng)寬比比基準(zhǔn)屏幕配置更小的屏幕資源


注意: 如果你的利用程序是為Android 3.2或更高的系統(tǒng)版本開發(fā)的,那末你需要查看下面Declaring Table Layouts for Android 3.2章節(jié),在定義layout資源的時(shí)候使用新的配置修飾符來聲明所適配的屏幕尺寸(替換表1中的尺寸修飾符)

更多關(guān)于這些修飾符如何匹配當(dāng)前屏幕實(shí)際尺寸和密度的內(nèi)容,請(qǐng)參考前面屏幕支持范圍(Range of Screens Support) 章節(jié)。

例如,下面的利用程序的資源目錄為不同的屏幕尺寸提供了不同的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 orientation

res/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-density

res/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ù)1定的邏輯規(guī)則來決定的。也就是,不管在哪一種屏幕下,你所使用的修飾符都不1定要跟當(dāng)前屏幕配置完全匹配,以便系統(tǒng)能夠自己選擇。具體來說,當(dāng)基于尺寸修飾符選擇資源的時(shí)候,如果沒有更匹配的資源,系統(tǒng)會(huì)選擇為比當(dāng)前屏幕更小的屏幕所提供的資源(例如,在需要的時(shí)候large尺寸的屏幕可能會(huì)使用normal尺寸的資源)。另外,如果唯1能夠使用的資源是為比當(dāng)前裝備屏幕更大的屏幕所提供的,那末系統(tǒng)將不會(huì)使用這些資源,并且利用程序會(huì)崩潰(例如,所有的layout資源都添加了xlarge修飾符,但是當(dāng)前裝備屏幕是normal尺寸屏幕)。更多關(guān)于系統(tǒng)選擇資源的信息,請(qǐng)參考How Android Finds the Best-matching Resource.

小貼士: 如果你有1些圖片資源希望系統(tǒng)永久不進(jìn)行縮放(可能你想要在程序運(yùn)行時(shí)由自己來控制和調(diào)劑),那末你應(yīng)當(dāng)把這些資源放到nodpi配置修飾符的資源文件夾中。在這個(gè)配置修飾符文件夾中的資源是密度無關(guān)的資源,系統(tǒng)永久不會(huì)對(duì)它們進(jìn)行縮放。

3.2 設(shè)計(jì)可替換的布局和圖片資源(Designing alternative layouts and drawables)

需要提供哪些可替換資源是根據(jù)你的利用程序需求來決定的。通常情況下,你需要使用尺寸和方向類的修飾符來提供可替換的layout資源,和使用密度類的修飾符提供可替換的圖片資源。

下面章節(jié)將分別總結(jié)為何你要使用尺寸類或密度類修飾符提供可替換的layout資源或圖片資源。

3.2.1 可替換布局資源(Alternative layouts)

通常情況下,只要你在不同配置的屏幕上測(cè)試你的利用程序,你就可以知道是不是需要為不同的屏幕尺寸提供可替換的layout資源了。例如:


  • 當(dāng)你在small屏幕上測(cè)試的時(shí)候,你可能會(huì)發(fā)現(xiàn)你的layout不能很好的填充在屏幕上。例如,在small屏幕上,屏幕的寬度內(nèi)不能填滿多個(gè)按鈕。這類情況下,你需要為small屏幕提供可替換的layout資源來調(diào)劑按鈕的尺寸和位置。

  • 當(dāng)你在extra-large屏幕上測(cè)試的時(shí)候,你可能會(huì)發(fā)現(xiàn)你的layout不能高效利用大屏幕的優(yōu)勢(shì),并且全部布局都被拉伸來填滿屏幕。這類情況下,你需要為extra-large屏幕提供可替換的layout資源,重新提供為大屏幕(例如平板)優(yōu)化的UI。
    雖然你的利用程序不為大屏幕提供可替換layout資源也能夠正常運(yùn)行,但對(duì)用戶來講,提供可替換資源能讓用戶感覺這個(gè)利用程序就是為了他的裝備所設(shè)計(jì)的。如果UI都被拉伸了,用戶對(duì)利用程序的用戶體驗(yàn)可能很反感。

  • 另外,當(dāng)測(cè)試橫向屏幕與豎向屏幕時(shí),你可能會(huì)發(fā)現(xiàn)豎向屏幕底部的UI元素在橫向屏幕上顯示在屏幕右側(cè)。


總結(jié),你應(yīng)當(dāng)確認(rèn)你的利用程序布局是存在以下幾點(diǎn):


  • 需要適配小屏幕(這樣用戶才能正常使用你的利用程序)
  • 是不是有對(duì)大屏幕進(jìn)行優(yōu)化以充分利用大屏幕帶來的額外空間
  • 是不是有對(duì)橫向和豎向屏幕進(jìn)行優(yōu)化


如果你的UI所使用的圖片即便在被系統(tǒng)縮放layout以后也要填充全部view(例如按鈕的背景圖片),那末你應(yīng)當(dāng)使用Nine-Patch圖片文件。Nine-Patch(點(diǎn)9圖)文件實(shí)際上就是在png圖片文件的基礎(chǔ)上指定了兩個(gè)維度上的可拉伸區(qū)域。當(dāng)系統(tǒng)拉伸使用點(diǎn)9圖的的view時(shí),所使用的點(diǎn)9圖也會(huì)被拉伸,只不過拉伸的只是點(diǎn)9圖上指定的可拉伸區(qū)域。因此,如果使用點(diǎn)9圖的話就不需要為不同的屏幕尺寸提供不同的圖片,由于點(diǎn)9圖能夠自動(dòng)調(diào)劑到任何尺寸。但是,你還是要為不同的屏幕密度提供可替換的點(diǎn)9圖資源。

3.2.2 可替換圖片資源(Alternative drawables)

幾近每個(gè)利用程序都需要為不同的屏幕密度提供可替換的圖片資源,由于每個(gè)利用程序都有1個(gè)啟動(dòng)圖標(biāo),最少要保證這個(gè)啟動(dòng)圖標(biāo)在每塊屏幕上都有良好的顯示效果。一樣,如果你的利用程序中還有其它的圖片(例如菜單圖標(biāo)或其它圖形),你都應(yīng)當(dāng)為不同的屏幕密度給每張圖片都提供可替換的版本。

注意: 你只需要為圖片文件(.png,.jpg或.git)和Nine-Patch文件提供密度相干的資源。如果你使用XML文件來定義圖形、色彩或其它drawable resources,那末你只需要在默許的圖片文件夾(drawable/)中保存1份代碼就能夠了。

要為不同的屏幕密度創(chuàng)建可替換的圖片資源,你應(yīng)當(dāng)遵守6種通用屏幕密度圖片的縮放比例3:4:6:8:12:16。例如,如果你有1張為medium屏幕密度設(shè)計(jì)的圖片尺寸是48x48像素,那末其它尺寸應(yīng)當(dā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)系

更多關(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)




自從第1代運(yùn)行Android 3.0系統(tǒng)的平板開始,為平板定義layout的重要方法就是把平板layout放到帶xlarge配置修飾符的資源文件夾中(例如res/layout-xlarge)。為了兼容其它類型的平板和屏幕尺寸(特別是7英寸的平板),Android 3.2開始引入新的方法來為更碎片化的屏幕尺寸指定資源。相對(duì)嘗試將你的layout適配到通用的尺寸(例如large或xlarge),新的技術(shù)是基于你的layout需要的空間大?。ɡ鐚挾纫?00dp)來調(diào)劑。

這么設(shè)計(jì)的緣由是當(dāng)使用通用尺寸為7英寸平板做適配時(shí),事情會(huì)變得非常辣手,由于7英寸平板在通用尺寸歸類技術(shù)上與5英寸手機(jī)都劃分為同1組(large類型)。雖然這類裝備從尺寸上來看非常相近,但是對(duì)利用程序的UI占用的空間大小來講是顯著不同的,一樣用戶交互習(xí)慣也不同。因此,7英寸和5英寸屏幕不應(yīng)當(dāng)使用相同的layout資源。為了實(shí)現(xiàn)為這兩種不同的屏幕尺寸提供不同的layout資源,Android現(xiàn)在允許你根據(jù)利用程序layout實(shí)際需要的尺寸來聲明layout資源的類型,并且要使用dp單位。

例如,你在為平板裝備特別設(shè)計(jì)好layout資源以后,應(yīng)當(dāng)在小于600dp寬度的屏幕上檢查這些layout是不是能使用。由于使用這些平板layout資源的條件就是屏幕的最小尺寸是不是滿足你聲明的尺寸。因此,現(xiàn)在你可以為你的利用程序UI指定1些只有在可用寬度最少為600dp時(shí)才能使用的layout資源。

你應(yīng)當(dāng)在指定1個(gè)寬度的同時(shí),以這個(gè)寬度作為最小尺寸來進(jìn)行設(shè)計(jì)。否則,你需要在完成layout資源后測(cè)試你的layout能夠支持的最小寬度。

注意: 所有使用新API指定的數(shù)值都是密度無關(guān)的值(dp),所以你的layout尺寸也應(yīng)當(dāng)使用dp單位來定義,由于你應(yīng)當(dāng)關(guān)心的只是系統(tǒng)計(jì)算屏幕密度后得出來的可用屏幕空間總值(強(qiáng)烈反對(duì)使用物理像素單位)。更多關(guān)于密度無關(guān)像素的內(nèi)容,請(qǐng)參考上面術(shù)語(yǔ)與概念(Terms and concepts) 章節(jié)。

4.1 使用新的尺寸修飾符(Using new size qualifiers)

表2總結(jié)了能夠根據(jù)屏幕可用空間大小來指定資源的配置修飾符。相比較于傳統(tǒng)的通用屏幕尺寸類型(small、normal、large、xlarge),新的修飾符能基于你的利用程序支持的屏幕尺寸給你提供更多的控制。

注意: 你使用這些修飾符指定的尺寸不是實(shí)際上的屏幕尺寸。實(shí)際上,這些尺寸是你的Activity窗口可用寬度或高度的dp值。Android系統(tǒng)可能會(huì)占用1些屏幕空間來顯示系統(tǒng)UI(例如屏幕底部的系統(tǒng)欄或頂部的狀態(tài)欄),因此1些屏幕可能沒法使用你的layout資源。也就是說,你聲明的尺寸應(yīng)當(dāng)是你的Activity需要的尺寸――系統(tǒng)會(huì)統(tǒng)計(jì)系統(tǒng)UI占用的空間后決定給你的layout提供多大的空間。另外也要注意Action Bar也是你的利用程序組成部份,雖然你的layout資源沒有聲明它,但是它一樣要占用你的layout可用空間的1部份,你在設(shè)計(jì)的時(shí)候也要把這部份給計(jì)算進(jìn)去。

表2 新的屏幕尺寸配置修飾符(Android 3.2引入)

屏幕配置 修飾符 說明
最小寬度 (smallestWidth) swdp
例如:sw600dp、sw720dp
屏幕的基本尺寸,由屏幕可用區(qū)域的最短尺寸所決定。準(zhǔn)確的說,裝備的最小寬度就是屏幕最短的可用高度和寬度(你也能夠認(rèn)為是屏幕有可能顯現(xiàn)的最短寬度)。你可使用這個(gè)修飾符來確保不管當(dāng)前屏幕的方向如何,你的利用程序UI最少可用的寬度都有 dp。
例如,你的利用程序不管任什么時(shí)候候都要求屏幕寬度最少要600dp,那末你就能夠使用這個(gè)修飾符創(chuàng)建1個(gè)layout資源并放到res/layout-sw600dp/的資源文件夾中。系統(tǒng)只會(huì)在當(dāng)前屏幕可用最小尺寸為600dp時(shí)才會(huì)使用這個(gè)資源,并且不管這個(gè)600dp是用戶認(rèn)為的高度還是寬度。最小寬度是1個(gè)固定的屏幕尺寸,是屏幕的1個(gè)屬性。不管當(dāng)前屏幕的方向如何,裝備的最小寬度都是不會(huì)變的。
裝備的最小寬度要斟酌到屏幕的裝潢空間和系統(tǒng)UI。例如,如果裝備屏幕有1些持久性的UI沿著最小寬度的軸心占據(jù)1定的空間,那末系統(tǒng)聲明的最小寬度值將會(huì)比實(shí)際屏幕的尺寸小,由于被占據(jù)的這部份屏幕空間你的UI永久沒法使用。
這是相對(duì)傳統(tǒng)通用尺寸修飾符(small、normal、large、xlarge)的替換方案,它允許你根據(jù)你的UI實(shí)際需要的可用尺寸定義離散的數(shù)值。使用最小寬度來定義通用尺寸是非常有用的,由于寬度通常是設(shè)計(jì)1個(gè)layout的關(guān)鍵因素。1個(gè)UI通??梢陨舷禄瑒?dòng),但是卻在橫向空間上沒法擴(kuò)大??捎脤挾韧瑫r(shí)也是決定是不是在手機(jī)上顯示單窗口layout或平板上顯示多窗口layout的關(guān)鍵因素。因此,你應(yīng)當(dāng)更加關(guān)注每種裝備上可能的最小寬度值是多少。
可用屏幕寬度 (Available screen width) wdp
例如:w720dp、w1024dp
通過值指定該資源文件夾中資源最小可用寬度的dp值。當(dāng)屏幕在橫向和豎向之間切換的時(shí)候,系統(tǒng)相應(yīng)的寬度值會(huì)改變,以實(shí)時(shí)更新你的UI當(dāng)前可用的實(shí)際寬度。
這通常對(duì)判斷是不是使用多窗口layout非常有用,由于雖然是在平板裝備上,你通常也不希望豎向多窗口布局與橫向的相同。因此,你可使用這個(gè)修飾符來聲明layout所需要的最小寬度,而不是同時(shí)使用屏幕尺寸和方向的修飾符來聯(lián)合聲明。
可用屏幕高度 (Available screen high) hdp
例如:h720dp、h1024dp
通過值指定該資源文件夾中資源最小可用高度的dp值。當(dāng)屏幕在橫向和豎向之間切換的時(shí)候,系統(tǒng)相應(yīng)的高度值會(huì)改變,以實(shí)時(shí)更新你的UI當(dāng)前可用的實(shí)際高度。
與使用wdp來定義layout所需寬度1樣,使用hdp來定義你的layout所需要的高度也是非常有用的,它可以免使用屏幕尺寸和方向兩種修飾符來進(jìn)行組合定義。但是,大多數(shù)app不需要這個(gè)修飾符。由于UI在需要的時(shí)候1般都能夠上下滑動(dòng),在可用高度的控制上本身就比較靈活,不像可用寬度沒法擴(kuò)大。


雖然看起來使用這些修飾符要比使用通用屏幕尺寸類修飾符更復(fù)雜,但是1旦你肯定了你的UI需求,使用這些修飾符實(shí)際上要簡(jiǎn)單很多。當(dāng)你在設(shè)計(jì)UI的時(shí)候,你所關(guān)心的最主要問題應(yīng)當(dā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è)值。使用表2中的修飾符,你就可以精確的控制你的layout切換臨界值。

更多關(guān)于這些尺寸配置修飾符的資料,請(qǐng)參考Providing Resource文檔。

4.2 配置實(shí)例(Configuration examples)

為了幫助你針對(duì)不同類型的裝備進(jìn)行設(shè)計(jì),下面是1些典型屏幕寬度的數(shù)值:


  • 320dp:1種典型的手機(jī)屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi等等)
  • 480dp:像是平板裝備的過渡線(480x800 mdpi)
  • 600dp:1種7英寸平板(600x1024 mdpi)
  • 720dp:1種10英寸平板(720x1028 mdpi、800x1280 mdpi等等)


使用表2中的尺寸修飾符,你的利用程序可以根據(jù)你想要的寬度(或高度)來設(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)1步自定義你的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è)例子中的資源所使用的最小寬度修飾符swdp,它所指的是不管當(dāng)前裝備的方向怎樣,屏幕寬高兩條邊中的最小寬度。因此,使用swdp從整體上疏忽了屏幕的方向并為你的layout指定屏幕的可用尺寸是1種比較方便的方法。

但是,在1些情況下,分辨當(dāng)前可用寬度或高度對(duì)你的UI非常重要。例如,如果你有1個(gè)內(nèi)置兩個(gè)窗口的layout要顯示兩個(gè)邊靠邊的fragment,你可能就需要根據(jù)當(dāng)前屏幕的寬度是不是大于等于600dp,和是不是橫向還是豎向才能決定是不是使用這個(gè)layout。這類情況下,你的資源文件應(yīng)當(dāng)類似下面:


res/layout/main_activity.xml         # 手機(jī)使用(可用寬度小于600dp)
res/layout-w600dp/main_activity.xml  # 多窗口 (任何可用寬度大于等于600dp的屏幕)


注意第2套資源使用的可用寬度修飾符是wdp。使用這類方法,有些裝備由于屏幕方向的改變致使兩種layout都會(huì)使用到(例如屏幕在1個(gè)方向上可用寬度最少有600dp,而在另外一個(gè)方向可用寬度小于600dp)。

如果可用高度才是你需要關(guān)注的點(diǎn)的話,你一樣也能夠與上面1樣使用hdp修飾符。乃至,你還可以聯(lián)合wdphdp兩種修飾符1塊使用,如果你真的需要的話。。。

4.3 聲明支持的屏幕尺寸(Declaring screen size support)

1旦你為不同的屏幕尺寸實(shí)現(xiàn)了對(duì)應(yīng)的layout后,在你的manifest文件中聲明你的利用程序所支持的屏幕也是一樣重要的。

相對(duì)新的屏幕配置修飾符,Android 3.2也為manifest的 元素引入了新的屬性。


  • android:requiresSmallesWidthDp
    聲明支持的最小屏幕寬度。最小寬度指的是屏幕空間(dp單位)上最短的邊能夠給你的利用程序最小的可用寬度,換句話說就是在屏幕兩條邊上最短的可用邊。因此,為了能讓裝備兼容你的利用程序,裝備的最小寬度應(yīng)當(dāng)?shù)扔诨虼笥诼暶鞯倪@個(gè)值。(通常聲明的這個(gè)“最小寬度”值指的是你的layout所支持的值,并且不管當(dāng)前屏幕是甚么方向。)
    例如,如果你的利用程序只支持最小可用寬度為600dp的平板裝備:
<manifest ... > <supports-screens android:requiresSmallestWidthDp="600" /> ... manifest>


但是,如果你的利用程序支持Android所支持的所有屏幕(比如小到426dpx320dp),那末你可以不用聲明這個(gè)屬性,由于你的利用程序支持的最小寬度已覆蓋了可能遇到的最小裝備了。

慎重: Android系統(tǒng)其實(shí)不會(huì)注意這個(gè)屬性,因此在運(yùn)行的進(jìn)程中這個(gè)屬性其實(shí)不會(huì)對(duì)利用程序的行動(dòng)產(chǎn)生任何影響。它的作用是在像Google Paly這樣的服務(wù)中過濾你的利用程序。不過,Google Play當(dāng)前其實(shí)不支持這個(gè)屬性過濾(在Android 3.2版本上)。因此如果你的利用程序不支持小屏幕,你還需要繼續(xù)使用其它關(guān)于尺寸的屬性。


  • android:compatibleWidthLimitDp
    這個(gè)屬性允許你通過指定你的利用程序所支持的最大的“最小寬度”值來啟用屏幕兼容模式作為1個(gè)可選的功能。如果裝備屏幕的最小邊可用寬度值大于你聲明的值,用戶仍然能夠安裝你的利用程序,不過會(huì)在屏幕兼容模式下運(yùn)行。默許情況下,屏幕兼容模式是關(guān)閉的,你的layout通常會(huì)被拉伸來填充屏幕。不過在系統(tǒng)欄會(huì)有1個(gè)按鈕允許用戶開啟或關(guān)閉屏幕兼容模式。

    注意: 如果你的layout能夠在大屏幕上正確的調(diào)劑大小,那末你不需要使用這個(gè)屬性。我們建議你避免使用這個(gè)屬性,你應(yīng)當(dāng)遵從本文檔提到的其它方法來確保你的layout尺寸能夠適配大屏幕。

  • android:largestWidthLimitDp
    這個(gè)屬性允許你通過指定你的利用程序支持的最大的“最小寬度”值來強(qiáng)迫啟用屏幕兼容模式。如果裝備可用屏幕的最小邊大于你聲明的值,你的利用程序?qū)?huì)在屏幕兼容模式下運(yùn)行,并且沒有任何途徑關(guān)閉兼容模式。

    注意: 如果你的利用程序layout能夠在大屏幕上正確調(diào)劑大小,那末你不需要使用這個(gè)屬性。我們建議你避免使用這個(gè)屬性,你應(yīng)當(dāng)遵從本文檔提到的其它方法來確保你的layout尺寸能夠適配大屏幕。


慎重: 當(dāng)為Android 3.2或更高版本系統(tǒng)開發(fā)利用程序時(shí),你不應(yīng)當(dāng)使用舊的屏幕尺寸屬性與上面列出的屬性組合使用。同時(shí)組合使用新的屬性和舊的尺寸屬性可能會(huì)致使沒法預(yù)感到到結(jié)果。

更多關(guān)于這些屬性的信息,請(qǐng)參考上面列出的相干鏈接。


最好實(shí)踐(Best Practices)




支持多樣屏幕的目的是為了創(chuàng)建能夠正常運(yùn)行,并且在Android支持的通用屏幕裝備上都能顯示良好的利用程序。本文前面的章節(jié)論述了Android如何適配你的利用程序到不同的屏幕配置上,和你可以怎樣為利用程序在不同的屏幕配置上定制不同的效果。本章節(jié)主要提供1些額外的小貼士,和關(guān)于確保你的利用程序在不同屏幕配置上都能良好縮放這類技術(shù)的概要。

下面是確保你的利用程序能夠在不同屏幕上良好顯示的快速檢查列表:


  1. 在XML layout文件中指定尺寸時(shí)要使用wrap_content、fill_parent或dp單位。

  2. 不要在你的利用程序代碼中使用固定的像素值。

  3. 不要使用AbsoluteLayout(已被廢棄)

  4. 為不同的屏幕密度提供可替換的圖片資源。


下面的章節(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單位來確保view在當(dāng)前裝備屏幕上能夠分配到1個(gè)適合的尺寸。

例如,1個(gè)view定義了layout_width="100dp",那末它在medium密度屏幕上將有100像素寬,而在high密度的屏幕上系統(tǒng)會(huì)將它放大到150像素寬,這樣view就在屏幕上占據(jù)大約相等物理尺寸。

一樣的,你應(yīng)當(dāng)使用sp(獨(dú)立尺度像素)單位來定義字體的尺寸。sp的縮放因子由用戶設(shè)定,系統(tǒng)會(huì)像處理dp1樣縮放這些尺寸。

5.2 不要在利用程序的代碼中寫死像素值

出于性能緣由和為了保持代碼的簡(jiǎn)單性,Android系統(tǒng)使用像素作為尺寸和坐標(biāo)值的標(biāo)準(zhǔn)單位。這意味著1個(gè)view的尺寸在代碼中都是用像素單位來表示,并且基于當(dāng)前屏幕密度而變化。例如,如果myView.getWidth()返回值為10,這表示在當(dāng)前屏幕上myView寬度為10像素,但是在更高密度的屏幕上,這個(gè)返回值可能為15像素。如果你在利用程序的代碼中使用像素值來定義圖片的尺寸,這會(huì)致使圖片沒法根據(jù)當(dāng)前屏幕密度進(jìn)行預(yù)縮放處理,你可能需要在自己的代碼中自行縮放這些像素值來適配未經(jīng)縮放的原圖。

如果你的利用程序需要在運(yùn)行時(shí)操作圖片或處理像素值,請(qǐng)參考下面Additional Density Consideration章節(jié)。

5.3 不要使用AbsoluteLayout

不像其它的layout控件,AbsoluteLayout強(qiáng)迫使用固定的值來給子view布局,這樣就致使在不同屏幕上很容易出現(xiàn)布局問題。因此,AbsoluteLayout在Android 1.5(API Level 3)就給廢棄了。

你應(yīng)當(dāng)替換使用RelativeLayout,它能夠根據(jù)相對(duì)位置給子view布局。例如,你可以指定1個(gè)按鈕應(yīng)當(dāng)顯示在1個(gè)TextView的右側(cè)。

5.4 使用尺寸和密度相干的資源

雖然系統(tǒng)會(huì)根據(jù)當(dāng)前屏幕配置自動(dòng)縮放你的layout和圖片資源,但你可能需要調(diào)劑UI在不同屏幕上的尺寸,和為不同的屏幕密度提供對(duì)應(yīng)的圖片資源。這實(shí)際上是重申上面章節(jié)講的內(nèi)容。

如果你需要控制你的利用程序在各個(gè)屏幕上的顯示效果,你需要在特定資源文件夾中調(diào)劑你的layout和圖片資源。例如,斟酌到1個(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


注意: 如果1個(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)1步控制圖片在不同密度屏幕上的繪制。本章節(jié)的內(nèi)容對(duì)大部份利用程序來講不是那末重要,除非你的利用程序在不同屏幕密度上運(yùn)行遇到問題,或你的利用程序需要操作圖形。

為了更好的理解在運(yùn)行進(jìn)程中是如何操作圖形來支持多種密度屏幕,你應(yīng)當(dāng)先理解系統(tǒng)用于確保正確縮放圖片的途徑:


  1. 預(yù)縮放資源(例如圖片資源)
    基于當(dāng)前屏幕的密度,系統(tǒng)使用你的利用程序提供的指定尺寸或密度修飾符的資源直接顯示。如果提供的資源與當(dāng)前屏幕密度不符合,系統(tǒng)將會(huì)加載默許的資源并放大或縮小這些資源來適配當(dāng)前的屏幕密度。系統(tǒng)會(huì)假定默許的資源(就是那些保存在沒有添加任何配置修飾符資源文件夾中的資源)是為屏幕密度的基準(zhǔn)(mdpi)而設(shè)計(jì)的,除非系統(tǒng)加載的資源是從其它密度修飾符資源文件中加載的。所謂的預(yù)縮放就是系統(tǒng)將圖片大小調(diào)劑到合適當(dāng)前屏幕尺寸時(shí)做的處理。 如果你需要獲得預(yù)縮放資源的尺寸,系統(tǒng)返回的將是縮放以后的資源尺寸。例如,1張為mdpi屏幕設(shè)計(jì)的圖片為50x50像素,它將會(huì)在hdpi屏幕上放大到75x75像素(如果沒有對(duì)應(yīng)的hdpi資源替換的話),并且系統(tǒng)返回的尺寸也將是放大后的這個(gè)值。
    在1些情況下,你可能不希望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)前裝備密度對(duì)這張圖片進(jìn)行縮放。

  2. 自動(dòng)縮放像素尺寸和位置
    利用程序可以通過在manifest文件中設(shè)置android:anyDensity屬性為false,或在程序代碼中把1張圖片的Bitmap對(duì)象的inScaled屬性設(shè)置為false來禁用預(yù)縮放處理。在這類情況下,系統(tǒng)將會(huì)在繪制進(jìn)程中自動(dòng)縮放絕對(duì)像素位置和像素尺寸。系統(tǒng)通過這么處理來保證使用像素定義的屏幕元素與在基準(zhǔn)屏幕密度(mdpi)上顯示的物理尺寸保持大致相同。系統(tǒng)所做的這些縮放處理對(duì)利用程序來講是透明,利用程序獲得到的也是縮放后的尺寸,而不是實(shí)際的物理像素尺寸。
    例如,假定1臺(tái)裝備是WVGA high密度的屏幕,它的分辨率為480x800并且與傳統(tǒng)的HVGA屏幕的大小1樣,現(xiàn)在它運(yùn)行1個(gè)禁用預(yù)縮放處理的程序。在這類情況下,當(dāng)利用程序要求屏幕尺寸時(shí),系統(tǒng)將會(huì)“欺騙”利用程序,返回320x533尺寸(近似mdpi的屏幕密度)。以后,當(dāng)利用程序履行繪畫操作時(shí),例如廢除1個(gè)位于(10,10)到(100,100)的矩形,系統(tǒng)將會(huì)適當(dāng)轉(zhuǎn)換這個(gè)位置的值,實(shí)際上廢除的區(qū)域?yàn)?15,15)到(150,150)。如果你的利用程序需要直接操作圖片的縮放,這個(gè)誤差可能會(huì)致使意想不到的結(jié)果,不過這是盡量斟酌利用程序的性能后得出的1個(gè)公道的方案。如果你遇到這類情況,請(qǐng)參考下面將dp單位轉(zhuǎn)換為像素單位(Converting dp units to pixel units) 。
    通常情況下,你不應(yīng)當(dāng)禁用預(yù)縮放處理。支持多樣屏幕的最好方法是遵從上面如何支持多屏幕(How to Support Multiple Screens) 章節(jié)提及的基本技術(shù)。


如果你的利用程序需要操作圖片或需要通過其它方式在屏幕上直接與像素進(jìn)行交互,那你可能需要采取額外的步驟來支持不同的屏幕密度。例如,如果你需要根據(jù)手指在屏幕上劃過的像素點(diǎn)來辨認(rèn)觸摸手勢(shì)并進(jìn)行響應(yīng),你就需要采取適當(dāng)?shù)拿芏葻o關(guān)像素值來取代實(shí)際像素值。

6.1 縮放運(yùn)行進(jìn)程中創(chuàng)建的Bitmap對(duì)象(Scaling Bitmap objects created at runtime)

如果你的利用程序在內(nèi)存中創(chuàng)建1張圖片(1個(gè)Bitmap對(duì)象),默許情況下系統(tǒng)會(huì)假定這張圖片是為medium這個(gè)基準(zhǔn)屏幕密度而設(shè)計(jì)的,并且在渲染的時(shí)候會(huì)自動(dòng)縮放。當(dāng)Bitmap沒有指定密度屬性時(shí),系統(tǒng)會(huì)添加“自動(dòng)縮放”屬性給Bitmap。如果你沒有正確計(jì)算當(dāng)前裝備的屏幕密度并且為Bitmap對(duì)象指定相應(yīng)的密度屬性,自動(dòng)縮放會(huì)跟你沒有提供可替換資源的處理方法1樣縮放這些Bitmap圖片。

為了控制運(yùn)行進(jìn)程中創(chuàng)建的Bitmap對(duì)象是不是縮放,你可以通過Bitmap的setDensity()為其指定密度類型,該方法可選參數(shù)值為DisplayMetrics類中定義的常量,例如DENSITY_HIGH或DENSITY_LOW。

如果你是通過BitmapFactory從文件或數(shù)據(jù)流這些數(shù)據(jù)源創(chuàng)建了Bitmap對(duì)象,那末你可以當(dāng)作這個(gè)Bitmap對(duì)象已存在1樣,使用BitmapFactory.Options來設(shè)置bipmap對(duì)象的屬性,系統(tǒng)通過這些屬性來決定如何對(duì)它進(jìn)行縮放。例如,你可以設(shè)置inDensity屬性來設(shè)置bitmap對(duì)象對(duì)應(yīng)的屏幕密度,和inScaled屬性來

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产一区精品视频 | 国产精品亚洲午夜一区二区三区 | 亚洲性色视频 | 永久免费在线视频 | 国产人成精品综合欧美成人 | 最近免费2019中文字幕大全 | 最近最新中文字幕1页 | 亚洲狠狠狠一区二区三区 | 日韩一级欧美一级在线观看 | 国产h视频在线观看网站免费 | xx免费视频| 久久入| 私人毛片免费高清影视院 | 岛国性视频播放免费视频 | 国产dvd毛片在线视频 | 欧美freesex黑人又粗又 | 免费在线视频播放 | 日韩视频在线观看一区二区 | 国产亚洲欧美另类专区 | 一区二区三区精品国产欧美 | 天天综合色一区二区三区 | 波多野结衣国产精品 | 非洲黑人最猛性xxxx_欧美 | 亚洲国产成人久久一区久久 | 91色欧美| 亚洲tv精品一区二区三区 | 中文字幕一二三区乱码 | 久久久www免费人成看片 | 精品国产乱码久久久久久一区二区 | 欧洲亚洲综合一区二区三区 | 国产精品久久久久天天影视 | 免费国产在线观看老王影院 | 小说区图片区综合久久亚洲 | 亚洲精品一二三 | aa级一级天堂片免费观看 | 亚州毛色毛片免费观看 | 性欧美18一19sex性高清播放 | 亚州春色校园另类 | 欧美头交videos在线播放 | 一区毛片| 中文字幕一区二区三区精彩视频 |