一、资源访问:
(一)、概念:
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、字符串资源文件:
示例代码:
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
>
|