與其他平台的應用程式一樣,android中的應用程式也會使用各種資源,比如圖檔,字串等,會把它們放入源碼的相應檔案夾下面,android也支援并鼓勵開發者把ui相關的布局和元素,用xml資源來實作。總結起來,android中支援的資源有:
•顔色值 /res/values 以resources為root的xml檔案,定義形式為<color name>value</color>
•字串 /res/values 以resources為root的xml檔案<string name>value</string>
•圖檔 /res/drawable 直接放入,支援9 patch可自由拉伸
詳細解釋:
android提供了一個自定義的2d圖形庫來繪制圖像和圖像.在android.graphics.drawable包中你就可以找到這些用于2維繪畫的通用類.
drawable是通常指的那種可以作畫的東西的抽象.你将發現drawable類擴充出了很多特定的可繪圖形類,包括bitmapdrawable,shapedrawable,picturedrawable,layerdrawable,等等.當然,你也可以從它們派生出你自己的類來定義你自己的drawable對象,并且以你獨有的方式來表現.
有三種方法來定義并執行個體化一個drawable:使用一個儲存在你的項目資源中的圖像;使用一個定義了drawable屬性的xml檔案;或使用普通的類對象構造方式.
1.從資源中的圖像建立
添加圖形到你的應用的一個簡單的方式是從你的項目資源中引用一個圖像檔案.支援的檔案格式有png(首選),jpg (可接受)和gif(不推薦).此技術優先用于程式圖示,logo,或其它圖形,比如用于遊戲中的.
要使用一個圖像資源,隻需把你的檔案添加到項目的res/drawable/檔案夾下.從這裡,你可以在你的代碼或xmllayout中引用它.不論從哪裡引用,推薦使用一個資源id,它是不帶擴充名的檔案名(例如,my_image.png的id是my_image).
注:圖像資源放在res/drawable/下,可能會在建構過程中自動被aapt工具無損壓縮以進行優化.例如,一個不需要超過256種顔色的真彩色png可能被轉換成一個帶有調色闆的8位png.這将造成保持圖像品質不變的情況下,占用更少的記憶體.是以要注意放在這個檔案夾下的圖像在建構期間可能會改變.如果你想把一個圖像作為比特流讀入以轉換成一個bitmap,那麼應把你的圖象放在res/raw/檔案夾下,在這裡他們不會被優化.
如果你想建立一個drawable對象,你就可以在在你的xml中定義drawable,并且把檔案儲存到項目的res/drawable/檔案夾下.然後,通過調用resources.getdrawable()方法擷取并執行個體化這個對象,把你的xml檔案的資源id傳給這個函數。
•圖檔的顔色 /res/values 以resources為root的xml檔案,定義形式為<drawable name>value</drawable>
•機關資源 /res/values 以resources為root的xml檔案<dimen name>value</dimen>
•菜單 /res/menu 以menuo為root的xml檔案
•布局 /res/layout 這個就是gui的布局和元素 (被編譯為螢幕布局(或螢幕的一部分)的xml檔案)
•風格和主題 /res/values 以resources為root的xml檔案<style name>value</style>
•動畫 /res/anim 有二種:一個是幀動畫(frame animation),也就是連續變換圖檔以animation-list為root的xml檔案;另外一種就是補間動畫(tweened
animation),它對應于api中的animation和animationset,有translate、scale、rotate、alpha四種,以set為root來定義,這個set就相當于animationset
目錄:
•/res/anim 用于存放動畫
•/res/drawable 存放圖檔,或等同于圖檔的資源如shape,或selector
在之前的版本中,隻有一個drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三個,這三個主要是為了支援多分辨率。
drawable- hdpi、drawable- mdpi、drawable-ldpi的差別:
(1)drawable-hdpi裡面存放高分辨率的圖檔,如wvga (480x800),fwvga (480x854)
(2)drawable-mdpi裡面存放中等分辨率的圖檔,如hvga (320x480)
(3)drawable-ldpi裡面存放低分辨率的圖檔,如qvga (240x320)
系統會根據機器的分辨率來分别到這幾個檔案夾裡面去找對應的圖檔。
在開發程式時為了相容不同平台不同螢幕,建議各自檔案夾根據需求均存放不同版本圖檔。
android的icon尺寸
在運作時,程式為最佳顯示效果提供了三種方法:
1.圖檔縮放
基于目前螢幕的精度,平台自動加載任何未經縮放的限定尺寸和精度的圖檔。如果圖檔不比對,平台會加載預設資源并且在放大或者縮小之後可以滿足目前界面的顯示要求。例如,目前為高精度螢幕,平台會加載高精度資源(如圖檔),如果沒有,平台會将中精度資源縮放至高精度。
2.自動定義像素尺寸和位置
如果程式不支援多種精度螢幕,平台會自動定義像素絕對位置和尺寸值等,這樣就能保證元素能和 精度160的螢幕上一樣能顯示出同樣尺寸的效果。例如,要讓wvga高精度螢幕和傳統的hvga 螢幕一樣顯示同樣尺寸的圖檔,當程式不支援時,系統會對 程式慌稱螢幕分辨率為320×533,在(10,10)到(100,100)的區域内繪制圖形完成之後,系統會将圖形放大到(15,15)到 (150,150)的螢幕顯示區域。
3.相容更大尺寸的螢幕
目前螢幕超過程式所支援螢幕的上限時,定義supports- screens元素,這樣超出顯示的基準線時,平台在此顯示黑色的背景圖。例如,wvga 中精度螢幕上,如程式不支援這樣的大螢幕,系統會謊稱是一個320×480的,多餘的顯示區域會被填充成黑色。
但為了達到最佳的顯示效果,最好的方法還是設計多套圖檔。那就有必要對于所有的螢幕依據精度值進行分級(高中低),之後再設計三套icon:
•/res/menu 存放menu
•/res/values 存放修飾性資源:字串,顔色,機關,風格和主題
values檔案可以被編譯成很多種類型的資源的xml檔案。注意:
values檔案夾不像其他的res/檔案夾,它可以儲存任意數量的檔案,這些檔案儲存了要建立資源的描述,而不是資源本身。xml元素類型控制這些資源應該放在r類的什麼地方。 盡管這個檔案夾裡的檔案可以任意命名,但還是要遵循一定的慣例(檔案命名的慣例是将元素類型包含在該名稱之中):
array.xml 定義數組
colors.xml 定義color drawable和顔色的字元串值(color string values)
使用resource.getdrawable()和resources.getcolor()分别獲得這些資源。
dimens.xml定義尺寸值(dimension value)。
使用resources.getdimension()獲得這些資源。
strings.xml定義字元串(string)值
使用resources.getstring()或者resources.gettext()擷取這些資源。
styles.xml 定義樣式(style)對象
res/xml/ 任意的xml檔案,在運作時可以通過調用resources.getxml()讀取。
res/raw/ 直接複制到裝置中的任意檔案。它們無需編譯,添加到你的應用程式編譯産生的壓縮檔案中。要使用這些資源,可以調用resources.openrawresource(),參數是資源的id,即r.raw.somefilename。
自動生成的r class 在項目檔案夾的gen檔案夾裡面有個r.java,我們平常引用的資源主要引用這個類的變量。 注意:r類是自動生成的,并且它不能被手動修改。當資源發生變動時,它會自動修改。
在代碼中使用資源:下面是一個引用資源的文法:r.resource_type.resource_name 或者 android.r.resource_type.resource_name 其中resource_type是r的子類,儲存資源的一個特定類型。resource_name是在xml檔案定義的資源的name屬性,或者有其他檔案類型為資源定義的檔案名(不包含擴充名,這指的是drawable檔案夾裡面的icon.png類似的檔案,name=icon)。android包含了很多标準資源,如螢幕樣式和按鈕背景。要在代碼中引用這些資源,必須使用android進行限定,如android.r.drawable.button_background。
•/res/layout 存放ui布局和元素
•/res/raw 存放運作時想使用的原始檔案
•/assets 存放運作時想使用的原始檔案
assets檔案夾是存放不進行編譯加工的原生檔案,即該檔案夾裡面的檔案不會像xml,java檔案被預編譯,可以存放一些圖檔,html,js,
css等檔案。
r.java檔案
除了原始檔案目錄/res/raw和/assets以外,其他的資源在編譯的時候都會被第三方軟體aapt進行處理,一個是把圖檔和xml檔案進行處理,例如把xml編譯成為二進制形式;另外處理的目的就是生成r.java檔案,這個檔案是通路資源時必須要用到的。
/res目錄下面的所有檔案都會映射到r.java檔案中,以整數id的形式被辨別,相同類型的資源被一個内部類來封裝。
在/res中定義或提供資源時的注意事項:
1. 同一個類型,或同一檔案夾下面的資源不可以使用相同的檔案名,也就是說不能用檔案擴充名來差別不同的檔案,因為r.java中隻保留資源的檔案名而不管擴充名,是以如果有二個圖檔一個是icon.png另一個是icon.jpg,那麼在r.java中隻會有一個r.drawable.icon。另外一個則會無法通路到。
2. 資源檔案的名字必須符合java變量的命名規則,且不能有大寫,隻能是'[a-z][0-9]._',否則會有編譯錯誤,因為r.java中的變量id要與資源中的檔案一一對應,也就是說用資源檔案名來作為id的變量名,是以一定要符合java變量的命名規則,另外它還不能有大寫。
3. 除了sdk支援的folder外,不能再有子folder,雖不會有編譯錯誤,但是子folder會被完全忽略,如在/res/layout下在建一個子folder activity(/res/layout/acitivity/,
那麼你在生成的r.java中是看不到activity和其内的内容的。
4. 對于資源檔案的大小有限制,最好不要讓單個檔案大于1m,這是sdk文檔說明的限制,但具體的我沒有進行試驗(據說2.2版本以後的可支援到10m,不知道是真的還是假的)
5. 所有/res下面的資源都能通過resources()并提供id來通路。
對于大多數資源在編譯時會對檔案内容進行特殊處理,以友善apk在運作時通路。
如果想要運作時使用未經處理的原始資源,可以把資源檔案放在/res/raw和/assets目錄下面