Android-支持多屏幕-1

原文連接:Supporting Multiple Screens html

Android運行在許多不一樣屏幕尺寸(screen size)和密度(screen density)的設備上。對於應用程序,Android系統提供了一致的跨設備開發環境,處理了應用程序適配屏幕的大部分工做。與此同時,爲了優化不一樣屏幕配置的UI設計,系統還提供了API讓你的應用程序爲特定的屏幕尺寸和密度作控制。例如,你可能想平板的UI和手機的不同。android

雖然系統會經過縮放(scaling)和調整尺寸來使你的應用程序工做在不一樣的屏幕上,但你也應該努力在不一樣的屏幕上進行優化。這麼作,你就能爲全部設備的用戶體驗最優化,你的用戶也就相信你的應用程序是爲了他們的設備設計的,這比簡單的拉伸去適應他們的設備好多了。ide

注意:這篇文檔假設你的應用程序是爲Android 1.6 (API Level 4) 或者更高版本設計的,若是你的應用程序要支持Android 1.5 或者更低的版本,請先閱讀Android 1.5 屏幕適配策略。
另外,注意Android 3.2有提供新的API去讓你更精確去控制應用程序對於不一樣屏幕尺寸的佈局資源(layout resources)。這些新的特性會讓你的應用程序在爲平板優化是顯得特別重要。更多的細節,會在"Declaring Tablet Layouts for Android 3.2"這一小節提到。佈局

1:屏幕支持概述

這一小節概述了Android對不一樣屏幕的支持,包括對該文檔和API中出現的名詞和概念的介紹,對系統支持的有關屏幕配置(screen configurations)和相關API,還有屏幕兼容的底層特性。測試

1.1:名字和概念

屏幕尺寸(Screen size)
實際的物理尺寸,根據屏幕的對角線進行測量。
爲了簡單起見,Android歸類了全部實際的屏幕尺寸爲四種泛化的尺寸: small , normal , large,extra large優化

屏幕密度(Screen density)
屏幕中一個物理區域包含的像素數;一般和dpi(dots per inch)相對應。例如,一個"low"密度屏幕比一個"normal"或者"high"密度的屏幕有更多的像素。
爲了簡單,Android歸類了全部實際屏幕密度爲四種泛化的密度:low, medium, high, extra highui

方向(Orientation)
從用戶角度看的屏幕方向。這裏指的是橫屏(landscape)或者豎屏(portrait),意味着屏幕高寬比(aspect ratio)分別是寬的或者是高的。注意不一樣設備的屏幕不僅是有默認的屏幕方向,它們也可能在運行時用戶翻轉屏幕發生改變。spa

分辨率(Resolution)
屏幕物理像素的總數,當進行多屏幕的支持時,程序沒必要和分辨率直接打交道;程序應該只關心屏幕的尺寸和密度,如上面指定的幾個泛化尺寸和密度歸類。設計

密度-獨立像素(Density-independent pixel [dp])
虛擬像素單位,也是你應該在定義UI佈局,表達尺寸和位置時使用的一種密度獨立方式。
在160dpi屏(也就是"medium"密度的屏幕的基線),一個密度獨立像素(dp)等於一個物理像素(px)。在運行時,系統會根據實際的屏幕密度去透明地處理dp單位的縮放比例。dp單位和px單位裝換很是簡單:
px = dp * (dpi /160).
例如:在240dpi的屏幕上,1dp = 1.5px。你應該老是使用dp去定義應用UI的大小,從而能夠保證在不一樣的密度屏幕上顯示你的UI。orm

1.2:支持的屏幕範圍

從Android 1.6(API Level 4)開始,Android爲不一樣的屏幕尺寸和密度提供了支持,反映了設備可能有的多種不一樣的屏幕配置(screen configuration)。你可使用Android系統的特性(feature)去爲每一個屏幕配置優化你應用程序的UI,還能夠保證你的程序UI不只合理得渲染,並且爲每一個用戶的屏幕都儘量提供最好的用戶體驗。

爲了簡化多屏幕的UI設計,Android把實際的屏幕尺寸和密度劃分爲:

  • 四種泛化的尺寸: small ,normal, large, xlarge 注意:從Android3.2(API level 13)開始,這種尺寸劃分已通過時了,取代的是一種管理屏幕尺寸和密度的新技術。若是你在開發Android 3.2或者更高的版本,看篇文章獲取更多信息Declaring Tablet Layouts for Android 3.2.

  • 四種泛化的密度: ldpi(low),mdpi(medium),hdpi(high),xhdpi(extra high)

在基準配置(baseline configuration)附近的泛化屏幕尺寸(generalized size)是normal,泛化屏幕密度(generalized density)是mdpi。這個基準線是創建在首部Android驅動的手機(T-Mobile G1)的屏幕配置(screen configuration)上的,它有一個HVGA屏(這是Android在1.6版本以前惟一支持的屏幕配置)。

每一種泛化尺寸和密度對應於實際屏幕尺寸和密度的一個範圍。例如,兩臺聲明有同樣的normal屏幕尺寸的設備,它的實際屏幕尺寸和寬高比(aspect ratio)可能有點不同。類似地,一樣聲明同樣hdpi的屏幕密度的設備,它的實際像素密度也可能有點不同。Android 在應用程序中抽象了這些輕微的不一致,因此你只須要爲泛化的尺寸提供UI設計,讓系統去處理必要的調整便可。圖一解釋了不一樣的尺寸和密度是如何歸類的。

圖 1

當你在爲不一樣屏幕尺寸設計UI時,你會發現每種設計都須要一個最小空間。因此,每種泛化屏幕尺寸之上會關聯上系統定義的最小分辨率。這些最小尺寸的單位是「dp」(你應該在定義佈局時使用它,可讓系統免於擔憂屏幕密度的改變問題)。

  • xlarge 的最小空間爲 960dp x 720dp

  • large 的最小空間爲 640dp x 480dp

  • normal的最小空間爲 470dp x 320dp

  • small 的最小空間爲 426dp x 320dp

注意:在Android 3.0先後的最小屏幕尺寸定義是不同的。因此你可能會碰到一些在normal和large的設備錯分的現象。這些也會創建在屏幕的物理分辨率上,因此會在跨屏幕上形成不一樣,例如一個帶有系統欄的1024  x 720的 平板實際上對於應用程序會稍微少一點可用空間,由於這部分空間已經被系統欄佔用了。

要爲不一樣的屏幕尺優化你的應用程序UI,你能夠爲不一樣的泛化尺寸和密度提供可選資源(alternative resources)。典型地,你應該提供可選擇的佈局(layouts)給不一樣的屏幕大小和可選擇的位圖圖片給不一樣的屏幕密度。 在運行時,系統會根據當前的設備屏幕的泛化尺寸和密度去選擇合適的資源。

你沒有必要爲每種屏幕尺寸和密度的組合都提供一種可選資源。系統提供了很是健壯的兼容特性(compatibility feature)去處理應用程序在不一樣設備上渲染的大部分工做,經過優雅地調整(resize)尺寸的技術來實現你的UI。(下面的小節"最佳實踐"上會進行描述)

注意:定義設備的泛化屏幕尺寸和密度的特徵是相互獨立的。例如:一個WVGA的高密度屏幕(high-density)被認爲是一個normal尺寸的屏幕由於它的物理尺寸和 T-Mobile G1的差很少(Android的首臺設備和基準屏幕配置)。在另外一方面,一個WVGA的中等密度屏幕(medium-denity)會認爲是large尺寸屏幕。雖然它們都有相同的分辨率(resolution,同樣數量的像素),WVGA的中等密度屏幕的屏幕密度更低,意味着每一個像素的物理尺寸要大些,所以整個屏幕也要比基準(normal)屏幕要大。

1.3:密度獨立(Density independence)

當UI元素在不一樣密度的屏幕上呈現時,程序會經過「像素獨立(density independence)」來維護它的物理尺寸(從用戶的角度)。

維護密度獨立是很是重要,由於若是沒有它,UI元素(好比按鈕)會在低密度(low density)的屏幕上的物理呈現要比高密度(high density)的大。這樣的密度相關(density-related)尺寸改變會致使應用程序的佈局和可用性問題。圖2和3分別向咱們展現了這些不一樣。

圖2:不支持不一樣密度的狀況,從左往右分別是 low, medium, high density的屏幕。

圖3:支持不一樣密度的狀況,從左往右分別是 low, medium, high density的屏幕。

Android 系統經過兩種方式去幫助你的應用程序完成密度獨立:

  • 系統在當前屏幕密度下適當地縮放dp單位

  • 系統在當前屏幕密度下適當地縮放繪製資源(drawable resource)

在圖2中,text view 和 bitmap drawable的維度(dimension)制定爲像素(px units),因此這些視圖在低密度的屏幕上比高密度的屏幕要大。這是由於,儘管它們的實際屏幕尺寸同樣,但高密度的屏幕在每英寸上擁有更多的像素(一樣的像素佔用更少的面積)。在圖3中,佈局的維度指定爲密度獨立(density-independent)像素(dp units)。由於密度獨立的基準線是個中等密度(medium-density)屏幕,因此帶有中等密度屏幕的設備就像圖2同樣擁有一致的視覺效果。然而,對於低密度和高密度的屏幕,系統會相應地縮放密度獨立像素去適應屏幕。

在大部分狀況下,你能夠經過簡單地在程序中使用dp單位或者"wrap_content"來保證密度獨立。系統會適當地縮放bitmap drawable顯示在不一樣的尺寸上,這是創建在當前屏幕密度的合適的縮放因子基礎上的。

然而,位圖的縮放可能會致使模糊或者出現馬賽克,你可能會在屏幕截圖上注意到這一點。爲了不這些現象,你應該爲不一樣的密度提供可選的位圖資源(alternative bitmap resource)。例如,你應該爲高密度(high-density)的屏幕提供更高分辨率的位圖,系統會使用這些圖片而不是去調整爲中等密度(medium-density)屏幕設計的位圖。接下來的小節將會描述更多關於如何爲不一樣的屏幕配置提供可選擇的資源。

2:如何支持多屏幕

Android對於多屏幕的支持基礎是它可以管理應用程序的佈局(layout)和位圖(bitmap drawables)的渲染,使得能在當前屏幕配置下已一種合理的方式工做。系統經過縮放佈局去適應屏幕尺寸/密度和縮放位圖去適應屏幕密度的方式,來負責處理應用程序在不一樣屏幕配置下的渲染工做。然而,爲了更好地處理不一樣的屏幕配置,你還應該:

(1)顯式地在manifest文件中聲明你的應用程序要支持那個屏幕尺寸
經過聲明你的應用程序支持的屏幕尺寸,你能夠保證只有你支持的設備可以下載你的應用程序。聲明對不一樣的屏幕尺寸的支持也會影響系統在更大屏幕上繪製你的應用程序,不論你的應用程序是否在屏幕兼容模式(screen compatibility mode)下。
去聲明應用程序支持的尺寸,你應該包含<supports-screens>元素到你的manifest文件中。

(2)爲不一樣的屏幕尺寸提供不一樣的佈局
默認地,Android會從新調整你的應用程序佈局大小去適應當前的設備屏幕。在大部分狀況下,這均可以很好地工做。但在有些狀況下,你的UI可能看起來就沒有那麼好了,這時候就須要爲不一樣屏幕尺寸作調整了。例如,在一個大屏幕上,你可能想去調整一些元素的位置和尺寸來利用額外的屏幕空間,或者在一個更小的屏幕上,你可能想調整大小去讓全部元素都能合適地放在屏幕上。
你能夠爲特定尺寸指定資源使用的配置限定詞(configuration qualifiers)有small,normal,large和xlarge。例如,對於特大屏幕的佈局應該放在layout-xlarge/裏面。
從Android 3.2 (API level 13)開始,以上的尺寸分類已通過時了,取而代之的是使用sw<n> dp配置限定詞去定義你的佈局資源須要的最小有效寬度。例如,若是你的多面板(multi-pane)平板佈局須要至少600dp的屏幕寬度,你應該把相 應的資源放到layout-sw600dp/裏面。更多關於使用新的技術去聲明佈局資源在 Declaring Tablet Layouts for Android 3.2小節中。

(3)爲不一樣的屏幕密度提供不一樣的位圖資源
默認地,爲了能夠在每臺設備上渲染出合適的物理尺寸,Android會縮放你的位圖(.png,,jpg,and .gif 文件) 和 .9圖片(Nine-Patch)。例如,若是你的應用程序僅爲基準的中等密度屏幕(mdpi)提供了圖片,那麼系統會在高密度(high-density)屏幕相應地放大,在低密度(low-density)的屏幕上縮小。這些縮放會給圖片帶來影響。爲了讓你的圖片看起來更舒服,你應該爲不一樣的屏幕密度提供不一樣分辨率的可選版本。
你能夠爲特定密度指定資源使用的配置限定詞有ldpi(low),mdpi(medium),hdpi(high)和xhdpi(extra high)。例如,在高密度屏幕上的圖片應該放到drawable-hdpi/文件夾中。

屏幕尺寸和密度配置限定詞對應的泛化尺寸和密度在上面的Range of screens supported小節有討論。
注意:若是你對於配置限定詞和系統是如何把它們應用到可選資源上還不是很熟悉,能夠閱讀Providing Alternative Resources獲取更多信息。

在運行時,系統會經過下面的步驟來保證資源可以儘量好地顯示在當前屏幕上:

1:系統使用合適的可選資源(alternative resource)
基於當前屏幕的尺寸和密度,系統會在你應用程序中提供的任何 size- 或者 density- 指定的資源。例如,若是設備是個高密度的屏幕,應用程序在請求一個drawable資源,系統會須按照一個最匹配屏幕配置的資源目錄。取決於其餘有效的可選資源,一個具備hdpi限定詞的資源目錄(好比drawable-hdpi/)多是最匹配的,所以系統會從這個目錄中選用drawable資源。

2:若是不存在有效的匹配資源,系統會使用默認的資源,而後經過放大或縮小它來知足當前的屏幕大小。
「默認」的資源是那些沒有配置限定符標誌的。例如,在drawable/目錄下是默認的drawable資源。系統假定這些資源是爲基準屏幕尺寸和密度而設計的,也就是normal尺寸和medium密度的屏幕。如此,系統會爲high-density的屏幕適當地放大默認密度的資源,反之low-density的屏幕則會進行縮小。 然而,當系統在尋找特定密度(density-specified)的資源而在特定密度的目錄下找不到時,它不老是會使用默認的資源的。系統可能會代替使用其餘的特定資源去進行縮放以獲得更好的結果。例如,當找不到low-density的資源時,系統更喜歡去縮小high-density的資源,由於系統能夠輕易的把high-density中的資源按照0.5的因子去縮小它去適應low-density的版本,這比起使用medium-density資源要0.75的縮放因子要更好些。

更多關於Android如何爲屏幕配置去選擇不一樣配置限定符資源的信息請閱讀How Android Finds the Best-matching Resource

2.1:使用配置限定符(configuration qualifier)

Android支持多種配置限定符去讓你控制系統使用可選的資源。配置限定符是跟在Android項目裏面資源目錄後的一個字符串。
使用配置限定符,你須要:

1:在你的項目res/目錄下建立一個線的目錄並使用這樣的命名格式. <resources_name> <qualifier>

  • <resources_name> 是一個標準的資源名(好比drawable 或者 layout)

  • <qualifier> 是表格1中的其中一個配置限定詞,指定每一個屏幕配置會使用到的資源。

2:在這個新的目錄下保存一個合適特定配置的資源。資源文件的名字必須和原來默認的同樣。
例如:xlarge是特大屏幕的配置限定詞。當你在資源目錄上加上這個字符串(好比layout-xlarge),系統就會在那些特大屏幕的設備上使用這些資源了。

表1. 爲不一樣屏幕配置提供的配置限定符。
  
注意:若是你在開發Android 3.2或者更高版本的應用程序,請關注這篇文章Declaring Tablet Layouts for Android 3.2獲取爲特定屏幕尺寸聲明佈局資源該使用的配置限定符。

更多關於這些限定符怎麼粗略地對應上真實的屏幕尺寸和密度,能夠看這篇文章:Range of Screens Supported,前面已經提到過了。

例如,下面在程序中的資源目錄列表分別爲不一樣屏幕尺寸提供不一樣的佈局設計和爲不一樣的屏幕密度提供了不一樣的圖片。

res/layout/my_layout.xml // layout for normal screen size ("default")

res/layout-small/my_layout.xml // layout for small screen size
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/my_icon.png // bitmap for medium density
res/drawable-hdpi/my_icon.png // bitmap for high density
res/drawable-xhdpi/my_icon.png // bitmap for extra high density

獲取更多關於怎麼使用可選資源和完整的配置限定符列表(不僅是屏幕配置),請看 Providing Alternative Resources這篇文章。

值得注意的是,當Android系統在運行時選擇資源時,它會按照某種邏輯去決定哪一個是」最匹配「(best matching)的資源。也就是,你沒有必要爲每一種屏幕配置都配備一份資源。特別地,當基於尺寸限定詞(size qualifier)選擇資源時,系統會使用比較小的那個資源若是沒有更合適的。(好比,若是有須要,一個large-size的屏幕會使用normal-size的資源)。然而,若是資源只存在比當前屏幕尺寸更大的限定符中,系統將不會使用它,你的程序將會崩潰若是沒有其餘符合設備配置的資源(好比,若是全部的資源都放到xlarge限定符的目錄下,可是設備是normal-size的屏幕)。更多信息關於系統如何選擇資源,請閱讀How Android Finds the Best-matching Resource

提示:若是你有些圖片資源是不但願被縮放的(可能由於你想在運行時本身去調整),你應該把它們放到nodpi的配置限定符目錄下。在這個限定符下的資源被認爲是密度不可知的(density-agnostic),系統不會去縮放它們。

2.2:設計可替換的佈局和圖片(drawables)

你要建立的可選資源類型取決於你程序的須要。一般,你應該使用尺寸和方向限定符去提供可選佈局資源,用密度限定符去提供可選圖片資源。
下面的小節分別總結了該如何使用尺寸和密度限定符去提供可選佈局或者圖片。

可選佈局(alternative layouts)

通常來講,你在不一樣屏幕配置下測試應用程序時,會知道是否應該爲不一樣的屏幕尺寸提供可選佈局。好比:

  • 當在小屏幕上測試時,你可能發現你的佈局不是很合適。好比,在小屏幕設備上的一排按鈕可能不太合適屏幕的寬度。在這種狀況下,你應該爲小屏幕提供可選佈局去調整尺寸或者按鈕的位置。

  • 當在特大屏幕上測試時,你可能發現你的佈局沒有有效地利用大屏幕而出現了明顯的拉伸現象。在這種狀況下,你應該爲特大屏幕提供爲它從新設計優化的UI的可選資源佈局。儘管你的程序在沒有爲大屏提供可選佈局的狀況下也可能工做地很好,可是讓用戶看起來這個程序是爲他們的設備而設計的這點是很是重要的。若是UI很明顯有拉伸,用戶可能不會滿意程序的體驗。

  • 還有,在對比測試橫屏和豎屏時,你可能會注意到在豎屏的底部的UI元素,在橫屏上應該放置在右側。

總結一下,你應該保證你的程序佈局:

  • 適用於小屏幕(這樣用戶能正常適用你的程序)

  • 爲大屏幕進行優化以利用額外的屏幕空間

  • 爲橫屏和豎屏同時優化

若是你的UI使用圖片在系統縮放佈局以後還須要填充view的尺寸(例如按鈕的背景),你應該使用.9圖片文件。一個.9文件是創建在指定了兩維的拉伸區域的PNG文件上的。當系統須要去縮放view使用的那個位圖時,系統會拉伸.9圖片特定的區域。這樣,你就沒必要爲不一樣的屏幕尺寸提供不一樣的圖片了,由於.9圖片能夠調整成任何大小。然而,你應該爲不一樣屏幕密度提供不一樣版本的.9圖片。

可選圖片(alternative drawables)

幾乎全部的應用程序都應該有不一樣屏幕密度的可選圖片資源,由於大部分應用程序有在所有屏幕密度下看上去漂亮的應用啓動圖標。一樣,若是你的程序包含其餘圖片(好比在應用中的菜單圖標或者其餘圖形),你應該爲每一個不一樣的密度提供一個可選擇的版本。

注意:你僅須要爲圖片文件和.9文件提供不一樣密度的文件。若是是用XML來定義的圖形,顏色或者其餘drawable資源,你應該在默認的drawable目錄(drawable/)下放一份拷貝。

爲不一樣屏幕密度建立可選的圖片,你應該在四種泛化密度上遵循 3 : 4 : 6 : 8 的縮放比例。好比,若是你爲medium-density的屏幕提供一張48x48的圖片(應用啓動圖片的尺寸),全部不一樣的尺寸應該是:

  • 36x36 for low-density

  • 48x48 for medium-density

  • 72x72 for high-density

  • 96x96 for extra high-density

更多關於如何設計圖標的信息,能夠看Icon Design Guidelines,裏面包含了不一樣的圖片尺寸信息,好比應用啓動圖標(launcher icons),菜單圖標(menu icons),狀態欄圖標(status bar icons),切換卡圖標(tab icons)和更多信息。

原博客譯文:http://www.darcye.com/article/46569744

相關文章
相關標籤/搜索