大多数资源文件都存放在res的相对子目录中,还有一些资源文件放在assets目录中。res只能存在相应的子目录,如,res/layout(布局资源),res/values(值资源),res/drawable(图像资源)。assets可以随意放,也可以放在子目录。两种方式主要区别如下。
- 引用资源的方式不同
res目录中的所有资源都会在R类的相应子类中生成对应的int类型变量
assets目录中的资源需要直接使用文件名来引用,如 assets/adc.xml,assets/abc/test.db。可以使用如下代码引用这俩个资源文件,并返回与资源文件对应的InputStream对象,剩下的操作就是普通java输入流操作了。
InputStream is1 = getResources().getAssets().open("adc.xml");
InputStream is2 = getResources().getAssets().open("abc/test.db");
- 处理方式不同
res目录中的资源子目录除了raw外,其他资源目录的资源文件都会被编译,而assets和res/raw目录中的资源文件不会做任何处理。
图像(drawable)资源
普通的图像资源文件就是图片啦,Android支持3种图像格式:png,jpg,gif。官方推荐png格式
图层(Layer)资源
定义图层资源必须使用< layer-list>标签作为资源文件的根节点,< layer-list>标签中可以包含多个,< item>标签,每一< item>表示一个图像,最后一个item会显示在最顶层。
默认情况下,图像会尽量充满显示图像的视图。因此,显示的图像可能会被拉伸。为了避免拉伸,可以在< item>标签中使用< bitmap>标签引用图像。例子。
<!-- 定义图层资源,该资源由俩个图像层叠放置 -->
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="20dp" android:left="20dp">
<bitmap android:src="@drawable/images1"
android:gravity="center"/>
</item>
<item android:top="20dp" android:left="20dp">
<bitmap android:src="@drawable/images2"
android:gravity="center"/>
</item>
</layer-list>
上面代码涉及了四个偏移量,android:top: 顶部偏移的像素。其他的一样。下面在< ImageView>标签中引用上面的图层资源
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/layer"/>
效果就是两张图片叠加,最后一个item在外面。
图像状态(State)资源
当按钮处于不同状态(正常,按下,获得焦点等)时会显示不同的样式,这些样式一般使用不同的图像来渲染,这就需要指定与不同状态对应的图像,而图像状态资源就是用来指定这些图像的。
<?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>
<!-- 获得焦点 -->
<item android:state_focused="true"
android:drawable="@drawable/focused">
</item>
<!-- 默认状态 -->
<item android:drawable="@drawable/normal">
</item>
</selector>
淡入淡出(Crossfade)资源
淡入淡出是切换俩个图像,并且是这俩个图像以淡入淡出效果进行切换
<?xml version="1.0" encoding="utf-8"?>
<trabsition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/lamp_off"/>
<item android:drawable="@drawable/lamp_on"/>
</trabsition>
<!-- 引用 -->
<ImageView
android:id="@+id/imageview_lamp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/cross_fade"/>
下面使用java代码实现
public class CrossFade extends Activity{
private ImageView ivLamp;
private Button btn_on,btn_off;
@Override
public void onCreate(Bundle savedlnstanceState){
super.onCreate(savedlnstanceState);
setContentView(R.layout.main);
ivLmap = (ImageView) findViewById(R.id.imageview_lamp);
btn_on = (Button) findViewById(R.id.btn_on);
btn_off = (Button) findViewById(R.id.btn_off);
//添加事件监听方法
btn_on.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TransitionDrawable drawable = (TransitionDrawable)ivLamp.getDrawable();
//从第一个切换到第二个使用1秒(1000毫秒)
drawable.startTransition(1000);
}
});
btn_off.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TransitionDrawable drawable = (TransitionDrawable)ivLamp.getDrawable();
//从第二个切换到第一个使用1秒(1000毫秒)
drawable.startTransition(1000);
}
});
}
}
运行可以看到俩张图片淡入淡出的效果。
嵌入(Inset)图像资源
如果显示的图像要求小于装载图像的视图(例如,背景图小于View区域),可以考虑使用嵌入图像资源。
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/background"
android:insetTop="50dp"/>
将布局标签的背景属性值设为嵌入图像资源,运行程序,会发现背景图距头部距离是50dp。
外形(Shape)资源
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 定义渐变色(从左下到右上绘制渐变色就是45度) -->
<gradient android:startColor="#fff"
android:endColor="#342"
android:angle="45"/>
<!-- 定义控件到边界的距离 -->
<padding android:left="7dp"/>
<!-- 定义边框线(灰色) -->
<stroke android:width="2dp" android:color="#ccc"/>
<!-- 定义圆角 -->
<corners android:radius="8dp"/>
</shape>