天天看點

Android資源通路

一、資源通路:   

(一)、概念:

    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>&lt;</code><code>resources</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>string</code>  <code>name</code><code>=</code><code>"red"</code><code>&gt;紅色&lt;/</code><code>color</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>string</code>  <code>name</code><code>=</code><code>"green"</code><code>&gt;綠色&lt;/</code><code>color</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>string</code>  <code>name</code><code>=</code><code>"blue"</code><code>&gt;藍色&lt;/</code><code>color</code><code>&gt;</code>

<code>&lt;/</code><code>resources</code><code>&gt;</code>

Java檔案中擷取方式:getResources().getString(R.string.red);

2、顔色資源檔案:

<code>    </code><code>&lt;</code><code>color</code> <code>name</code><code>=</code><code>"red"</code><code>&gt;#f00&lt;/</code><code>color</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>color</code> <code>name</code><code>=</code><code>"green"</code><code>&gt;#0f0&lt;/</code><code>color</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>color</code> <code>name</code><code>=</code><code>"blue"</code><code>&gt;#00f&lt;/</code><code>color</code><code>&gt;</code>

在需要調用該顔色的地方寫法是:android:background="@color/blue"

Java檔案中擷取方式:getResources().getColor(R.color.blue);

3、尺寸資源檔案:

<code>    </code><code>&lt;</code><code>dimen</code>  <code>name</code><code>=</code><code>"title"</code><code>&gt;20dp&lt;/</code><code>color</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>dimen</code>  <code>name</code><code>=</code><code>"content"</code><code>&gt;10dp&lt;/</code><code>color</code><code>&gt;</code>

Java檔案中擷取方式:getResources().getDimension(R.dimen.title);

4、數組資源檔案:

    Android中,不推薦将數組直接定義在java檔案中,而是使用數組資源檔案來定義數組。

    定義在res下values目錄下:arrays.xml檔案中。格式如下:

根元素:&lt;resources&gt;&lt;/resources&gt;

子元素:可以有三種。

&lt;array&gt;&lt;/array&gt;:稱為類型數組Typed-Array資源(或者:資源數組資源)

&lt;string-array&gt;&lt;/string-array&gt;

&lt;integer-array&gt;&lt;/integer-array&gt;

下級子元素:&lt;item&gt;數值&lt;/item&gt;

<code>    </code><code>&lt;</code><code>string-array</code> <code>name</code><code>=</code><code>"choiceItems"</code><code>&gt; </code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;主屏模式&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;wifi設定&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;藍牙設定&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;網絡設定&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;More&lt;/</code><code>item</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>string-array</code><code>&gt;</code>

Java檔案中擷取方式:getResources().getStringArray(R.array.choiceItems);

【備注:】如果是int型數組,則格式如下:

<code>    </code><code>&lt;</code><code>integer-array</code> <code>name</code><code>=</code><code>"age"</code><code>&gt; </code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;20&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;30&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;40&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;50&lt;/</code><code>item</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>integer-array</code><code>&gt;</code>

Java檔案中擷取方式:getResources().getIntArray(R.array.age);

【備注:】如果是資源數組資源,則格式如下:

<code>    </code><code>&lt;</code><code>array</code> <code>name</code><code>=</code><code>"icons"</code><code>&gt; </code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;@drawable/home&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;@drawable/setting&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;@drawable/logout&lt;/</code><code>item</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>array</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>array</code> <code>name</code><code>=</code><code>"title"</code><code>&gt; </code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;首頁&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;設定&lt;/</code><code>item</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>item</code> <code>&gt;退出&lt;/</code><code>item</code><code>&gt;</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&lt;Map&lt;String, Object&gt;&gt; parseXML(XmlResourceParser pullParser,</code>

<code>                        </code><code>String tagName) {</code>

<code>                </code><code>List&lt;Map&lt;String, Object&gt;&gt; list = </code><code>null</code><code>;</code>

<code>                </code><code>Map&lt;String, Object&gt; 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&lt;Map&lt;String, Object&gt;&gt;();</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&lt;String, Object&gt;();</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>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code><code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code>

<code>&lt;</code><code>layer-list</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code><code>&gt;</code>

<code>    </code><code>&lt;</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>&gt;</code>

<code>        </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;/</code><code>item</code><code>&gt;</code>

<code>            </code><code>android:src</code><code>=</code><code>"@drawable/android2"</code>

<code>&lt;/</code><code>layer-list</code><code>&gt;</code>

D、圖像狀态(State)資源:selector

<code>    </code><code>&lt;</code><code>selector</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code><code>&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</code><code>item</code> <code>android:drawable</code><code>=</code><code>"@drawable/normal"</code><code>/&gt;</code>

<code>&lt;/</code><code>selector</code><code>&gt;</code>

E、圖像級别(Level)資源:level-list

<code>//UI代碼:</code>

<code>&lt;</code><code>level-list</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code><code>&gt;</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>/&gt;</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>/&gt;</code>

<code>&lt;/</code><code>level-list</code><code>&gt;</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>&lt;</code><code>transition</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code><code>&gt;</code>

<code>&lt;!-- transition标簽中隻能有兩個item标簽,也就是隻支援兩個圖像的切換 --&gt;</code>

<code>    </code><code>&lt;</code><code>itemandroid:drawable</code><code>=</code><code>"@drawable/lamp_off"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>itemandroid:drawable</code><code>=</code><code>"@drawable/lamp_on"</code><code>/&gt;</code>

<code>&lt;/</code><code>transition</code><code>&gt;</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>&lt;?</code><code>xmlversion</code><code>=</code><code>"1.0"</code><code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code>

<code>&lt;</code><code>shape</code>

<code>    </code><code>xmlns:android</code><code>=</code><code>"  android:shape="</code><code>rectangle"&gt;</code>

<code>&lt;!-- shape有四個值:rectangle(矩形)、oval(橢圓)、line(直線)、ring(圓環)--&gt;</code>

<code>&lt;!-- 定義漸變色 ,從左下角到右上角繪制漸變色--&gt;</code>

<code>&lt;</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>/&gt;</code>

<code>&lt;!-- 定義控件内容到邊界的距離--&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>&lt;!-- 定義邊框線的寬度及顔色--&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;!-- 定義圓角半徑--&gt;</code>

<code>    </code><code>&lt;</code><code>corners</code>

<code>        </code><code>android:radius</code><code>=</code><code>"8dp"</code><code>/&gt;</code>

<code>&lt;/</code><code>shape</code><code>&gt;</code>

本文轉自 墨宇hz 51CTO部落格,原文連結:http://blog.51cto.com/zzhhz/1633123

繼續閱讀