Android應用源代碼:界面佈局文件、Java源文件、資源文件。
“魔術數值”指直接在代碼中使用字符串、數值而不做註釋,這些數值常常讓人摸不着頭腦,大大增加了程序的維護成本。Android通過將各種資源放到res目錄中定義,提高程序的可維護性。
Android應用資源的兩大類:
assets目錄下,無法通過R資源清單類訪問的原生資源,應用程序需要通過AssetManager以二進制流的形式讀取資源。
res目錄下,可通過R資源清單訪問的資源,Android SDK會在編譯應用時,自動在R.java文件中爲這些資源建立索引。
res目錄下的資源:
目錄 |
存放的資源 |
animator/ |
屬性動畫的XML文件 |
anim/ |
補間動畫的XML文件 |
color/ |
顏色列表的XML文件 |
drawable/ |
存放各種位圖,和一些XML文件 |
layout/ |
界面佈局文件 |
menu/ |
菜單資源的XML文件 |
raw/ |
任意類型的原生資源(比如音頻文件、視頻文件等),再Java代碼中通過調用Resources對象的openRawResource(int id)方法來獲取該資源的二進制文件 |
values/ |
各種簡單值的XML文件,如字符串、整數值、顏色值、數組等 |
xml/ |
原生XML文件,可以通過Resources.getXML()方法訪問 |
資源的訪問:
1. 在Java代碼中使用資源清單項
[<package_name>.]R.<resource_type>.<resource_name>
2. 在Java代碼中訪問實際資源
需要藉助Resources類,通過Context.getResource()獲取Resources,Resources類提供瞭如下兩類方法:
getXxx(int id) //根據資源清單ID獲取實際資源
getAssets() //獲取訪問assets目錄下資源的AssetManager對象
3. 在XML文件中使用資源
@[<package_name>:]<resource_type>/<resource_name>
顏色值的定義:
Android支持4種顏色值的形式:
#RGB 0到f,16級顏色
#ARGB 0到f,16級顏色,0到f,16級透明度
#RRGGBB 00到ff,256級顏色
#AARRGGBB 00到ff,256級顏色,00到ff,256級透明度
數組資源Array
三種子元素:
<array…/>
<string-array…/>
<integer-array…/>
StateListDrawable資源(選擇器)
StateListDrawable對象所顯示的Drawable對象會隨目標組件狀態的改變而自動切換。
StateListDrawable對象的XML文件根元素爲<selector…/>,該元素可以包含多個<item…/>元素,可以指定如下屬性:
android:color或android:drawable:指定顏色或Drawable對象
android:state_xxx:指定一個特定狀態
<item…/>元素支持的狀態:
狀態 |
含義 |
android:state_pressed |
按下的狀態,(按下但是還沒鬆開) |
android:state_focused |
當前View獲取了焦點 |
android:state_selected |
用戶選擇了當前View |
android:state_checked |
用戶選中了View,一般用於CheckBox這種非黑即白的選項 |
android:state_enabled |
當前View處於可用的狀態 |
android:state_hovered |
光標是否懸停,通常與focused state相同,它是4.0的新特性 |
android:state_checkable |
組件是否能被check。如:RadioButton是可以被check的。 |
android:state_active |
是否被激活 |
android:state_window_focused |
應用程序是否在前臺,當有通知欄被拉下來或者一個對話框彈出的時候應用程序就不在前臺了 |
LayerDrawable資源:
LayerDrawable包含一個Drawable數組,系統將會按這些Drawable對象的數組順序來繪製它們,索引最大的Drawable對象將會被繪製在最上面。
LayerDrawable對象的XML文件的根元素爲<layer-list…/>,該元素可以包含多個<item…/>元素。
<item…/>元素可指定如下屬性:
android:drawable:Drawable對象
android:id:Drawable對象的id
android:buttom|top|left|right:長度值,用於將該Drawable對象繪製到目標組件的特定位置
ShapeDrawable資源:
用於定義基本幾何圖形。
ShapeDrawable對象的XML文件的根元素爲<shape…/>,可以指定屬性:
android:shape[“rectangle”|”oval”|”line”|”ring”]用於指定幾何圖形的類型。
ClipDrawable資源:
ClipDrawable代表從其他位圖上截取一個“圖片片段”,在XML中使用<clip…/>元素。
可以指定如下三個屬性:
android:drawable:指定截取的Drawable對象
android:clipOrientation:指定截取方向,水平或垂直
android:gravity:指定讀取時的對齊方式
ClipDrawable對象調用setLevel(intlevel)設置截取區域的大小,0爲空,10000爲截取整張圖。
AnimationDrawable資源:代表動畫,逐幀動畫或是補間動畫。
PropertyAnimation屬性動畫資源
樣式(Style)和主題(Theme)資源
樣式(Style):
一個樣式等於一組格式的集合。
Android的樣式一般定義在res/values/styles.xml文件中,其中有一個根元素<resources…/>,而具體的每種樣式定義則是通過<resources…/>下的子標籤<style…/>來完成,<style…/>通過添加多個<item…/>來設置樣式不同的屬性。
<style…/>元素的屬性:
name:指定樣式的名稱
parent:屬性聲明要繼承的父樣式
主題(Theme):
與樣式資源非常相似,區別在於:
主題不能作用於單個View組件,主題應該對整個應用中的所有Activity起作用,或者對指定的Activity其作用。
主題定義的格式應該是改變窗口外觀的格式,例如窗口標題、窗口邊框等。
Android 5.0 新增了Material設計的主題,開發者只要將App主題設爲android:Theme.Material.Xxx即可啓用Material主題。
屬性資源(Attribute)
放在res/values目錄下,通過AttributeSet對象來獲取屬性。
使用原始資源:
raw目錄下,按上面的語法格式訪問
assets目錄下,用AssetsManager的InputStream open(String fileName),AssetFileDescriptoropenFd(String fileName)訪問Assets資源