一、资源访问:   

(一)、概念:

    Android中的资源是指可以在代码中使用的外部文件,这些文件作为应用程序的一部分,被编译到应用程序中。在项目中,这些资源被保存到Android应用的res目录下。

(二)、资源分类:

  1. id;

  2. 字符串资源文件;

  3. 颜色资源

  4. 尺寸资源文件

  5. 布局资源

  6. 数组资源

  7. 样式和主题资源

  8. 菜单资源

  9. 已编译的任意XML资源文件【重要】: res/xml

  10. 未编译的原始资源文件: res/raw

  11. 图像(Drawable)资源

    1. 普通图像资源

    2. xml图像资源:bitmap

    3. 图层(Layer)资源:layer-list , item

    4. 图像状态(State)资源:selector , item

    5. 图像级别(Level)资源:level-list , item

    6. 淡入淡出(CrossFade)资源:transition , item(只支持两个)

    7. 外形(Shape)资源:shape(shape , gradient , padding ,corners , stroke)

  12. 动画资源

  • 透明度补间动画    alpha

  • 缩放补间动画    scale

  • 旋转补间动画    rotate

  • 移动补间动画     translate

  1. 属性动画:res/animator   (api11之后出现)   

  2. 逐帧动画: res/anim      animation-list , item

  3. 补间动画:  res/anim

【备注:】资源编译器会编译除了raw资源以外的所有资源,并将它们全部放到最终的.apk文件中。apk(Android Package)包含Android应用程序的代码和资源。

(三)、各种资源文件的xml格式:

1、字符串资源文件:

示例代码:

1
2
3
4
5
< resources >
     < string   name = "red" >红色</ color >
     < string   name = "green" >绿色</ color >
     < string   name = "blue" >蓝色</ color >
</ resources >

Java文件中获取方式:getResources().getString(R.string.red);

2、颜色资源文件:

示例代码:

1
2
3
4
5
< 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、尺寸资源文件:

示例代码:

1
2
3
4
< resources >
     < dimen   name = "title" >20dp</ color >
     < dimen   name = "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>

示例代码:

1
2
3
4
5
6
7
8
9
< 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型数组,则格式如下:

1
2
3
4
5
6
7
8
< 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);

【备注:】如果是资源数组资源,则格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
< 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文件中获取方式:

TypedArray arrIcons = getResources().obtainTypedArray(R.array.icons);

Drawable drawable = arrIcons.getDrawable(0);

5、原始XML资源

  • 位置:res/xml目录下;

  • 定义格式:格式良好的,没有特殊要求的普通xml文件;

  • Java文件中获取方式:getResources().getXml(R.xml.文件名称);

  • 解析xml的核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  // 从资源文件夹中读取原始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:gravity

C、图层(Layer)资源:layer-list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<? xml  version = "1.0" encoding = "utf-8" ?>
< layer-list  xmlns: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

1
2
3
4
5
6
<? 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

1
2
3
4
5
6
7
8
9
10
11
12
13
//UI代码:
<? xml  version = "1.0" encoding = "utf-8" ?>
< level-list  xmlns: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 >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//java代码:
public  class  LevelActivity  extends  Activity {
 
     private  ImageView imageview_lamp;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
 
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_level);
         imageview_lamp = (ImageView) findViewById(R.id.imageview_lamp);
 
     }
 
 
 
 
     public  void  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 ;
         }
     }
}

F、淡入淡出(CrossFade)资源:transition

1
2
3
4
5
6
7
8
9
10
11
<? xml  version = "1.0" encoding = "utf-8" ?>
 
     < transition  xmlns:android = "http://schemas.android.com/apk/res/android" >
 
<!-- transition标签中只能有两个item标签,也就是只支持两个图像的切换 -->
 
     < itemandroid:drawable = "@drawable/lamp_off" />
 
     < itemandroid:drawable = "@drawable/lamp_on" />
 
</ transition >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//java代码:
public  class  CrossfadeActivity  extends  Activity {
 
     private  ImageView imageview_lamp;
 
     private  TransitionDrawable drawable =  null ;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
 
         super .onCreate(savedInstanceState);
 
         setContentView(R.layout.activity_crossfade);
 
         imageview_lamp = (ImageView) findViewById(R.id.imageview_lamp);
 
         drawable = (TransitionDrawable) imageview_lamp.getDrawable();
     }
 
     public  void  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 ;
 
         }
     }
}

G、外形(Shape)资源:shape

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<? xmlversion = "1.0" encoding = "utf-8" ?>
 
< shape
     xmlns: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 >