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/animator (api11之后出现)
- 逐帧动画: res/anim animation-list , item
- 补间动画: res/anim
- 透明度补间动画 alpha
- 缩放补间动画 scale
- 旋转补间动画 rotate
- 移动补间动画 translate
【备注:】资源编译器会编译除了raw资源以外的所有资源,并将它们全部放到最终的.apk文件中。apk(Android Package)包含Android应用程序的代码和资源。
13、attr资源
(三)、各种资源文件的xml格式:
1、字符串资源文件:
示例代码:
<resources>
<string name="red">红色</color><string name="green">绿色</color><string name="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>
<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>
示例代码:
<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文件中获取方式:
TypedArray arrIcons =
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
<?xmlversion="1.0"encoding="utf-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:state_pressed="true"android:drawable="@drawable/pressed"/>
<itemandroid:state_focused="true"android:drawable="@drawable/focused"/>
<itemandroid: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>