一、資源通路:
(一)、概念:
Android中的資源是指可以在代碼中使用的外部檔案,這些檔案作為應用程式的一部分,被編譯到應用程式中。在項目中,這些資源被儲存到Android應用的res目錄下。
(二)、資源分類:
id;
字元串資源檔案;
顔色資源
尺寸資源檔案
布局資源
數組資源
樣式和主題資源
菜單資源
已編譯的任意XML資源檔案【重要】: res/xml
未編譯的原始資源檔案: res/raw
圖像(Drawable)資源
普通圖像資源
xml圖像資源:bitmap
圖層(Layer)資源:layer-list , item
圖像狀态(State)資源:selector , item
圖像級别(Level)資源:level-list , item
淡入淡出(CrossFade)資源:transition , item(隻支援兩個)
外形(Shape)資源:shape(shape , gradient , padding ,corners , stroke)
動畫資源
透明度補間動畫 alpha
縮放補間動畫 scale
旋轉補間動畫 rotate
移動補間動畫 translate
屬性動畫:res/animator (api11之後出現)
逐幀動畫: res/anim animation-list , item
補間動畫: res/anim
【備注:】資源編譯器會編譯除了raw資源以外的所有資源,并将它們全部放到最終的.apk檔案中。apk(Android Package)包含Android應用程式的代碼和資源。
(三)、各種資源檔案的xml格式:
1、字元串資源檔案:
示例代碼:
<code><</code><code>resources</code><code>></code>
<code> </code><code><</code><code>string</code> <code>name</code><code>=</code><code>"red"</code><code>>紅色</</code><code>color</code><code>></code>
<code> </code><code><</code><code>string</code> <code>name</code><code>=</code><code>"green"</code><code>>綠色</</code><code>color</code><code>></code>
<code> </code><code><</code><code>string</code> <code>name</code><code>=</code><code>"blue"</code><code>>藍色</</code><code>color</code><code>></code>
<code></</code><code>resources</code><code>></code>
Java檔案中擷取方式:getResources().getString(R.string.red);
2、顔色資源檔案:
<code> </code><code><</code><code>color</code> <code>name</code><code>=</code><code>"red"</code><code>>#f00</</code><code>color</code><code>></code>
<code> </code><code><</code><code>color</code> <code>name</code><code>=</code><code>"green"</code><code>>#0f0</</code><code>color</code><code>></code>
<code> </code><code><</code><code>color</code> <code>name</code><code>=</code><code>"blue"</code><code>>#00f</</code><code>color</code><code>></code>
在需要調用該顔色的地方寫法是:android:background="@color/blue"
Java檔案中擷取方式:getResources().getColor(R.color.blue);
3、尺寸資源檔案:
<code> </code><code><</code><code>dimen</code> <code>name</code><code>=</code><code>"title"</code><code>>20dp</</code><code>color</code><code>></code>
<code> </code><code><</code><code>dimen</code> <code>name</code><code>=</code><code>"content"</code><code>>10dp</</code><code>color</code><code>></code>
Java檔案中擷取方式:getResources().getDimension(R.dimen.title);
4、數組資源檔案:
Android中,不推薦将數組直接定義在java檔案中,而是使用數組資源檔案來定義數組。
定義在res下values目錄下:arrays.xml檔案中。格式如下:
根元素:<resources></resources>
子元素:可以有三種。
<array></array>:稱為類型數組Typed-Array資源(或者:資源數組資源)
<string-array></string-array>
<integer-array></integer-array>
下級子元素:<item>數值</item>
<code> </code><code><</code><code>string-array</code> <code>name</code><code>=</code><code>"choiceItems"</code><code>> </code>
<code> </code><code><</code><code>item</code> <code>>主屏模式</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>wifi設定</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>藍牙設定</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>網絡設定</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>More</</code><code>item</code><code>></code>
<code> </code><code></</code><code>string-array</code><code>></code>
Java檔案中擷取方式:getResources().getStringArray(R.array.choiceItems);
【備注:】如果是int型數組,則格式如下:
<code> </code><code><</code><code>integer-array</code> <code>name</code><code>=</code><code>"age"</code><code>> </code>
<code> </code><code><</code><code>item</code> <code>>20</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>30</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>40</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>50</</code><code>item</code><code>></code>
<code> </code><code></</code><code>integer-array</code><code>></code>
Java檔案中擷取方式:getResources().getIntArray(R.array.age);
【備注:】如果是資源數組資源,則格式如下:
<code> </code><code><</code><code>array</code> <code>name</code><code>=</code><code>"icons"</code><code>> </code>
<code> </code><code><</code><code>item</code> <code>>@drawable/home</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>@drawable/setting</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>@drawable/logout</</code><code>item</code><code>></code>
<code> </code><code></</code><code>array</code><code>></code>
<code> </code><code><</code><code>array</code> <code>name</code><code>=</code><code>"title"</code><code>> </code>
<code> </code><code><</code><code>item</code> <code>>首頁</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>設定</</code><code>item</code><code>></code>
<code> </code><code><</code><code>item</code> <code>>退出</</code><code>item</code><code>></code>
Java檔案中擷取方式:
TypedArray arrIcons = getResources().obtainTypedArray(R.array.icons);
Drawable drawable = arrIcons.getDrawable(0);
5、原始XML資源
位置:res/xml目錄下;
定義格式:格式良好的,沒有特殊要求的普通xml檔案;
Java檔案中擷取方式:getResources().getXml(R.xml.檔案名稱);
解析xml的核心代碼:
<code> </code><code>// 從資源檔案夾中讀取原始xml資源檔案 XmlResourceParser pullParser = getResources().getXml(R.xml.citylist);</code>
<code> </code><code>//将讀取xml資源檔案傳回的XmlResourceParser 對象繼續解析,擷取到xml節點中需要的資料。</code>
<code> </code><code>//備注:XmlResourceParser 類是XmlPullParser的子類</code>
<code> </code><code>public</code> <code>List<Map<String, Object>> parseXML(XmlResourceParser pullParser,</code>
<code> </code><code>String tagName) {</code>
<code> </code><code>List<Map<String, Object>> list = </code><code>null</code><code>;</code>
<code> </code><code>Map<String, Object> map = </code><code>null</code><code>;</code>
<code> </code><code>int</code> <code>event;</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>// 根據讀取的xml節點來擷取事件類型</code>
<code> </code><code>event = pullParser.getEventType();</code>
<code> </code><code>// 隻要不是文檔結束就一直執行循環</code>
<code> </code><code>while</code> <code>(event != XmlPullParser.END_DOCUMENT) {</code>
<code> </code><code>// 擷取每個節點的節點名稱</code>
<code> </code><code>String nodeName = pullParser.getName();</code>
<code> </code><code>// 根據事件類型來執行不同的操作</code>
<code> </code><code>switch</code> <code>(event) {</code>
<code> </code><code>// 當文檔開始就執行個體化list</code>
<code> </code><code>case</code> <code>XmlPullParser.START_DOCUMENT:</code>
<code> </code><code>list = </code><code>new</code> <code>ArrayList<Map<String, Object>>();</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>// 根據節點的不同來執行執行個體化map和往map中添加資料的操作</code>
<code> </code><code>case</code> <code>XmlPullParser.START_TAG:</code>
<code> </code><code>if</code> <code>(nodeName.equals(tagName)) {</code>
<code> </code><code>map = </code><code>new</code> <code>HashMap<String, Object>();</code>
<code> </code><code>// 本例中,沒有文本節點,有n個屬性節點,而所需要的内容全在屬性節點中。故使用getAttributeValue(index)方法</code>
<code> </code><code>// getAttributeValue(index)方法中的</code>
<code> </code><code>// index是指節點的索引下标,從0開始。可以了解成屬性點 順序。</code>
<code> </code><code>map.put(pullParser.getAttributeValue(</code><code>3</code><code>),</code>
<code> </code><code>pullParser.getAttributeValue(</code><code>2</code><code>));</code>
<code> </code><code>list.add(map);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>// 執行循環</code>
<code> </code><code>event = pullParser.next();</code>
<code> </code><code>}</code>
<code> </code><code>} </code><code>catch</code> <code>(Exception e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>list;</code>
<code> </code><code>}</code>
6、原生檔案資源: raw
如何通路raw目錄下的檔案?
InputStream is = getResources().openRawResource(R.raw.檔案名);
7、圖像資源:
A、普通圖像資源:
B、xml圖像資源:bitmap
C、圖層(Layer)資源:layer-list
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code><code>encoding</code><code>=</code><code>"utf-8"</code><code>?></code>
<code><</code><code>layer-list</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code><code>></code>
<code> </code><code><</code><code>item</code>
<code> </code><code>android:top</code><code>=</code><code>"10dp"</code>
<code> </code><code>android:left</code><code>=</code><code>"10dp"</code><code>></code>
<code> </code><code><</code><code>bitmap</code>
<code> </code><code>android:src</code><code>=</code><code>"@drawable/android1"</code>
<code> </code><code>android:gravity</code><code>=</code><code>"center"</code><code>/></code>
<code> </code><code></</code><code>item</code><code>></code>
<code> </code><code>android:src</code><code>=</code><code>"@drawable/android2"</code>
<code></</code><code>layer-list</code><code>></code>
D、圖像狀态(State)資源:selector
<code> </code><code><</code><code>selector</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code><code>></code>
<code> </code><code><</code><code>item</code> <code>android:state_pressed</code><code>=</code><code>"true"</code><code>android:drawable</code><code>=</code><code>"@drawable/pressed"</code><code>/></code>
<code> </code><code><</code><code>item</code> <code>android:state_focused</code><code>=</code><code>"true"</code><code>android:drawable</code><code>=</code><code>"@drawable/focused"</code><code>/></code>
<code> </code><code><</code><code>item</code> <code>android:drawable</code><code>=</code><code>"@drawable/normal"</code><code>/></code>
<code></</code><code>selector</code><code>></code>
E、圖像級别(Level)資源:level-list
<code>//UI代碼:</code>
<code><</code><code>level-list</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code><code>></code>
<code> </code><code>android:drawable</code><code>=</code><code>"@drawable/lamp_off"</code>
<code> </code><code>android:minLevel=“5" </code><code>android:maxLevel</code><code>=</code><code>"10"</code><code>/></code>
<code> </code><code>android:drawable</code><code>=</code><code>"@drawable/lamp_on"</code>
<code> </code><code>android:minLevel=“11" </code><code>android:maxLevel</code><code>=</code><code>"20"</code><code>/></code>
<code></</code><code>level-list</code><code>></code>
<code>//java代碼:</code>
<code>public</code> <code>class</code> <code>LevelActivity </code><code>extends</code> <code>Activity {</code>
<code> </code><code>private</code> <code>ImageView imageview_lamp;</code>
<code> </code><code>@Override</code>
<code> </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>setContentView(R.layout.activity_level);</code>
<code> </code><code>imageview_lamp = (ImageView) findViewById(R.id.imageview_lamp);</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>clickButton(View view) {</code>
<code> </code><code>switch</code> <code>(view.getId()) {</code>
<code> </code><code>case</code> <code>R.id.button_level_lampoff:</code>
<code> </code><code>imageview_lamp.setImageLevel(</code><code>9</code><code>);</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>case</code> <code>R.id.button_level_lampon:</code>
<code> </code><code>imageview_lamp.setImageLevel(</code><code>15</code><code>);</code>
<code>}</code>
F、淡入淡出(CrossFade)資源:transition
<code> </code><code><</code><code>transition</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code><code>></code>
<code><!-- transition标簽中隻能有兩個item标簽,也就是隻支援兩個圖像的切換 --></code>
<code> </code><code><</code><code>itemandroid:drawable</code><code>=</code><code>"@drawable/lamp_off"</code><code>/></code>
<code> </code><code><</code><code>itemandroid:drawable</code><code>=</code><code>"@drawable/lamp_on"</code><code>/></code>
<code></</code><code>transition</code><code>></code>
<code>public</code> <code>class</code> <code>CrossfadeActivity </code><code>extends</code> <code>Activity {</code>
<code> </code><code>private</code> <code>TransitionDrawable drawable = </code><code>null</code><code>;</code>
<code> </code><code>setContentView(R.layout.activity_crossfade);</code>
<code> </code><code>drawable = (TransitionDrawable) imageview_lamp.getDrawable();</code>
<code> </code><code>drawable.startTransition(</code><code>3000</code><code>);</code>
<code> </code><code>drawable.reverseTransition(</code><code>3000</code><code>);</code>
G、外形(Shape)資源:shape
<code><?</code><code>xmlversion</code><code>=</code><code>"1.0"</code><code>encoding</code><code>=</code><code>"utf-8"</code><code>?></code>
<code><</code><code>shape</code>
<code> </code><code>xmlns:android</code><code>=</code><code>" android:shape="</code><code>rectangle"></code>
<code><!-- shape有四個值:rectangle(矩形)、oval(橢圓)、line(直線)、ring(圓環)--></code>
<code><!-- 定義漸變色 ,從左下角到右上角繪制漸變色--></code>
<code><</code><code>gradient</code>
<code>android:startColor</code><code>=</code><code>"#FF00"</code>
<code>android:endColor</code><code>=</code><code>"#80FF00FF"</code>
<code>android:angle</code><code>=</code><code>"45"</code><code>/></code>
<code><!-- 定義控件内容到邊界的距離--></code>
<code> </code><code><</code><code>padding</code>
<code> </code><code>android:left</code><code>=</code><code>"20dp"</code>
<code> </code><code>android:top</code><code>=</code><code>"20dp"</code>
<code> </code><code>android:right</code><code>=</code><code>"20dp"</code>
<code> </code><code>android:bottom</code><code>=</code><code>"20dp"</code><code>/></code>
<code><!-- 定義邊框線的寬度及顔色--></code>
<code> </code><code><</code><code>stroke</code>
<code> </code><code>android:width</code><code>=</code><code>"2dp"</code>
<code> </code><code>android:color</code><code>=</code><code>"#00F"</code><code>/></code>
<code> </code><code><!-- 定義圓角半徑--></code>
<code> </code><code><</code><code>corners</code>
<code> </code><code>android:radius</code><code>=</code><code>"8dp"</code><code>/></code>
<code></</code><code>shape</code><code>></code>
本文轉自 墨宇hz 51CTO部落格,原文連結:http://blog.51cto.com/zzhhz/1633123