Android資源訪問
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)
動畫資源
逐幀動畫: res/animanimation-list , item
補間動畫:res/anim
透明度補間動畫alpha
縮放補間動畫scale
旋轉補間動畫rotate
移動補間動畫translate
3、屬性動畫:res/animator
【備註:】資源編譯器會編譯除了raw資源以外的所有資源,並將它們全部放到最終的.apk檔案中。apk(Android Package)包含Android應用程式的程式碼和資源。
13、attr資源:自定義View
(三)、各種資原始檔的xml格式:
1、字串資原始檔:
示例程式碼:
<resources> <stringname="red">紅色</color> <stringname="green">綠色</color> <stringname="blue">藍色</color> </resources> Java檔案中獲取方式:getResources().getString(R.string.red);
2、顏色資原始檔:
示例程式碼:
<resources> <color name="red">#f00</color> <color name="green">#0f0</color> <color name="blue">#00f</color> </resources> 在需要呼叫該顏色的地方寫法是:android:background="@color/blue" Java檔案中獲取方式:getResources().getColor(R.color.blue);
3、尺寸資原始檔:
示例程式碼:
<resources> <dimenname="title">20dp</color> <dimenname="content">10dp</color> </resources> 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>
示例程式碼:
<resources> <string-array name="choiceItems"> <item >主屏模式</item> <item >wifi設定</item> <item >藍芽設定</item> <item >網路設定</item> <item >More</item> </string-array> </resources> Java檔案中獲取方式:getResources().getStringArray(R.array.choiceItems); 【備註:】如果是int型陣列,則格式如下: <resources> <integer-array name="age"> <item >20</item> <item >30</item> <item >40</item> <item >50</item> </integer-array> </resources> Java檔案中獲取方式:getResources().getIntArray(R.array.age); 【備註:】如果是資源陣列資源,則格式如下: <resources> <array name="icons"> <item >@drawable/home</item> <item >@drawable/setting</item> <item >@drawable/logout</item> </array> <array name="title"> <item >首頁</item> <item >設定</item> <item >退出</item> </array> </resources> Java檔案中獲取方式: TypedArrayarrIcons = getResources().obtainTypedArray(R.array.icons); Drawable drawable = arrIcons.getDrawable(0);
5、原始XML資源【重要】
位置:res/xml目錄下;
定義格式:格式良好的,沒有特殊要求的普通xml檔案;
Java檔案中獲取方式:getResources().getXml(R.xml.檔名稱);
解析xml的核心程式碼:
// 從資原始檔夾中讀取原始xml資原始檔 XmlResourceParser pullParser = getResources().getXml(R.xml.citylist); //將讀取xml資原始檔返回的XmlResourceParser 物件繼續解析,獲取到xml節點中需要的資料。 //備註:XmlResourceParser 類是XmlPullParser的子類 public List<Map<String, Object>> parseXML(XmlResourceParser pullParser, String tagName) { List<Map<String, Object>> list = null; Map<String, Object> map = null; int event; try { // 根據讀取的xml節點來獲取事件型別 event = pullParser.getEventType(); // 只要不是文件結束就一直執行迴圈 while (event != XmlPullParser.END_DOCUMENT) { // 獲取每個節點的節點名稱 String nodeName = pullParser.getName(); // 根據事件型別來執行不同的操作 switch (event) { // 當文件開始就例項化list case XmlPullParser.START_DOCUMENT: list = new ArrayList<Map<String, Object>>(); break; // 根據節點的不同來執行例項化map和往map中新增資料的操作 case XmlPullParser.START_TAG: if (nodeName.equals(tagName)) { map = new HashMap<String, Object>(); // 本例中,沒有文字節點,有n個屬性節點,而所需要的內容全在屬性節點中。故使用getAttributeValue(index)方法 // getAttributeValue(index)方法中的 // index是指節點的索引下標,從0開始。可以理解成屬性點 順序。 map.put(pullParser.getAttributeValue(3), pullParser.getAttributeValue(2)); list.add(map); } break; } // 執行迴圈 event = pullParser.next(); } } catch (Exception e) { e.printStackTrace(); } return list; }
6、原生檔案資源: raw
【備註:】raw目錄下主要放置的資源有音訊、視訊等檔案。raw目錄下的檔案會在R.java中被註冊。 如何訪問raw目錄下的檔案? InputStream is = getResources().openRawResource(R.raw.檔名);
7、影象資源:
A、普通影象資源:
Java檔案中獲取方式:getResources().getDrawable(R.drawable.imagename); int resId = getResources().getIdentifier(imgName, "drawable",this.getPackageName()); view.getResources().getResourceName(resid) int resId = context.getResources().getIdentifier("圖片名稱", "drawable", context.getPackageName()); imageView_main_showpic.setImageResource(resId);
B、xml影象資源:bitmap
<bitmap android:src="@drawable/android1" android:gravity="center"/>
C、圖層(Layer)資源:layer-list
<?xmlversion="1.0"encoding="utf-8"?> <layer-listxmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="10dp" android:left="10dp"> <bitmap android:src="@drawable/android1" android:gravity="center"/> </item> <item android:top="10dp" android:left="10dp"> <bitmap android:src="@drawable/android2" android:gravity="center"/> </item> </layer-list>
D、影象狀態(State)資源:selector
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/pressed"/> <item android:state_focused="true" android:drawable="@drawable/focused"/> <item android:drawable="@drawable/normal"/> </selector>
E、影象級別(Level)資源:level-list
//UI程式碼:
<?xmlversion="1.0"encoding="utf-8"?> <level-listxmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/lamp_off" android:minLevel=“5"android:maxLevel="10"/> <item android:drawable="@drawable/lamp_on" android:minLevel=“11"android:maxLevel="20"/> </level-list> //java程式碼: publicclass LevelActivity extends Activity { private ImageView imageview_lamp; @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_level); imageview_lamp = (ImageView) findViewById(R.id.imageview_lamp); } publicvoid clickButton(View view) { switch (view.getId()) { case R.id.button_level_lampoff: imageview_lamp.setImageLevel(9); break; case R.id.button_level_lampon: imageview_lamp.setImageLevel(15); break; default: break; } } }
F、淡入淡出(CrossFade)資源:transition
<?xmlversion="1.0"encoding="utf-8"?> <transitionxmlns:android="http://schemas.android.com/apk/res/android"> <!-- transition標籤中只能有兩個item標籤,也就是隻支援兩個影象的切換 --> <itemandroid:drawable="@drawable/lamp_off"/> <itemandroid:drawable="@drawable/lamp_on"/> </transition> //java程式碼: publicclass CrossfadeActivity extends Activity { private ImageView imageview_lamp; private TransitionDrawable drawable = null; @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_crossfade); imageview_lamp = (ImageView) findViewById(R.id.imageview_lamp); drawable = (TransitionDrawable) imageview_lamp.getDrawable(); } publicvoid clickButton(View view) { switch (view.getId()) { case R.id.button_level_lampon: drawable.startTransition(3000); break; case R.id.button_level_lampoff: drawable.reverseTransition(3000); break; default: break; } } }
G、外形(Shape)資源:shape
<?xmlversion="1.0"encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle”> <!-- shape有四個值:rectangle(矩形)、oval(橢圓)、line(直線)、ring(圓環)--> <!-- 定義漸變色 ,從左下角到右上角繪製漸變色--> <gradient android:startColor="#FF00" android:endColor="#80FF00FF" android:angle="45"/> <!-- 定義控制元件內容到邊界的距離--> <padding android:left="20dp" android:top="20dp" android:right="20dp" android:bottom="20dp"/> <!-- 定義邊框線的寬度及顏色--> <stroke android:width="2dp" android:color="#00F"/> <!-- 定義圓角半徑--> <corners android:radius="8dp"/> </shape>