對android的屏幕分類,主要是依靠這2個屬性來分類:size和density.你要意識到你的程序會被安裝到的設備的屏幕,都是由size和density來限定這個屏幕的規格。這樣的話,你的APP要包括多種可選擇的資源,使得你的程序在不同的size和density的屏幕上達到最好的顯示效果。
size在廣義上來說一般有四種:small,normal,large,xlarge
以及四種density:low(ldpi),medium(mdpi),high(hdpi),extra high(xhdpi)
爲了明確在不同的屏幕上要使用的佈局和bitmap資源,你必須要把這些可選擇的資源放在不同的目錄之下,就像前面說的定義不同語言的字符串一樣。
而且也要注意,屏幕方向(橫屏或者豎屏)的變化也是被認爲是一種屏幕size的變化,所以很多APP也需要對在不同屏幕方向下的layout進行修正,以達到最優的用戶體驗。
創建不同的layout
爲了讓你的用戶在不同的屏幕size下都達到最優的體驗效果,那麼針對你的app想支持的不同的屏幕size,你都要去提供一個唯一的xml layout文件。每一個layout都要被放在對應的目錄之下,這個目錄用 –<screen_size(屏幕規格)>這個後綴來修飾.比方說一個針對大屏的layout文件要放置在/res/layout-large/目錄下。
注意:android系統爲了適當的去適應屏幕,它會自動去縮放你的layout。所以,對於不同屏幕size的layout,你不必去糾結於非常精確的UI元素的大小,而是要關注整個layout的佈局,這個是影響用戶體驗的關鍵(比方說裏面在同一層的重要的兄弟視圖的大小和位置).
下面的例子裏面,這個項目包含有一個默認的layout和一個針對large規格屏幕的layout :
MyProject/
res/
layout/
main.xml
layout-large/
main.xml
這2個文件的名字必須一致,但是爲了在不同的對應的屏幕下展現最合適的UI,裏面的內容可以不一樣。
在你的app代碼裏面使用layout的方法,一般是:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
系統會根據你的app運行的屏幕規格,來載入對應的合適的layout目錄。想了解更多關於android如何選擇合適的資源,請閱讀Providing Resources
下面舉另外一個例子,這個例子裏面,這個項目爲手機屏幕在橫屏的時候,提供了一個指定的layout:
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
默認的layout是針對豎屏的。
如果你還想要針對large規格的手機,提供在豎屏的時候的一個特殊layout,那麼這個layout目錄需要加2個修飾符:
MyProject/
res/
layout/ # default (portrait)
main.xml
layout-land/ # landscape
main.xml
layout-large/ # large (portrait)
main.xml
layout-large-land/ # large landscape
main.xml
注意:在android3.2以及之上的版本,提供了一種更加高級的方法來定義屏幕的規則,它允許你根據與density無關的最小的屏幕像素寬度和高度,來指定不同的資源給不同的規格的屏幕。這一節裏面我們不講這個新的技術,想要了解更多,請閱讀:Designing for Multiple Screens.
創建不同的Bitmap
你應該爲廣義上的四種density:low,medium,high,extar-high提供合適縮放比例的bitmap資源。這麼做可以讓的你app在屏幕上表現出非常好的圖形效果和屏幕展現。
你可以利用原始的矢量圖來創建你需要針對不同density的縮放比例的圖片,一般我們使用如下的縮放比例:
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0 (baseline)
- ldpi: 0.75
這個意思是說爲xhdpi的設備,你要製作一張200*200的圖片,同理的你需要爲其他的density分別製作的圖片規格爲:hdpi:150x150 , mdpi:100x100 , ldpi:75x75
把這些圖片資源放置到合適的drawable資源目錄下:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
任何時候我們使用@drawable/awesomeimage的時候,系統都根據屏幕的density選取不同的圖片。
注意:對伊low-density的資源並不是必須定義的。當你提供了hdpi的資源的時候,系統在low-density的屏幕下,會自動的把hdpi裏面的資源圖片規格縮放到原來的一半,來適應low-density的屏幕。
查看更多app icon創建的指導,請閱讀:Iconography design guide.