閱讀493 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android資源文件夾及資源文件的詳細介紹

與其他平台的應用程序一樣,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目錄下麵

最後更新:2017-04-03 05:39:31

  上一篇:go 采雲間Data Process Center(DPC)公測
  下一篇:go C# 下利用ICSharpCode.SharpZipLib.dll實現文件/文件夾壓縮、解壓縮