Android应用可以将资源存储在两个目录:res和assets。其中res目录中的资源只能存储在相应的子目录(如res/layout、res/values等)中,不能直接将资源存储在res目录中。assets目录中的资源可以任意存放,也可以建立任意层次的子目录。res和assets资源的主要区别如下:

1. 资源引用的方式不同

res目录中的所有资源都会在R类的相应子类中生成对应的int类型变量,需要使用这些变量来引用资源。例如res/layout/main.xml是布局文件资源,会在R.layout类中生成一个名为main的变量,所以需要使用R.layout.main来引用main.xml。

assets目录中的资源需要直接使用文件名来引用,例如assets/xyz.xml、assets/abc/test.db是assets目录中的两个资源文件,其中abc是assets中的子目录。可以使用如下的代码引用这两个资源文件,并返回与资源文件对应的InputStream对象,剩下的操作就是普通的Java输入流操作了。

InputStream is1 = getResources().getAssets().open("xyz.xml");  
InputStream is2 = getResources().getAssets().open("abc/test.db");



2. 资源处理方式不同

res目录中的资源子目录除了raw外,其他资源目录中的资源文件都会被编译,这也是为什么将APK文件解压后无法直接查看XML格式资源文件内容的原因。而assets与res/raw目录中的资源文件不会做任何处理,所以将APK文件解压后,这两个目录中的资源文件都会保持原样。


3. 子目录结构不同

res目录只能有一层子目录,而且这些子目录必须是预定义的,如res/layout、res/values等都是合法的,而res/abc、res/xyz并不是合法的资源目录,在assets目录中可以建任意层次的子目录(只受操作系统的限制)。


★ 利用ADT模板创建本地化资源

1. 本地化图标资源

选择Android工程的任何位置,右键——》New——》Other...——》Android——》Android Icon Set,可以创建多种图像资源,如图: 

android 在resources下创建文件夹 安卓resources_子目录

 

android 在resources下创建文件夹 安卓resources_android_02

2. XML文件资源

可以设置语言(Language)、屏幕密度(Density)等

android 在resources下创建文件夹 安卓resources_子目录_03

 

android 在resources下创建文件夹 安卓resources_子目录_04

android 在resources下创建文件夹 安卓resources_资源文件_05

使用state状态只能进行简单的图像切换,没有任何特效,这在一个对效果要求较高的程序中略显得有些单调。

淡入淡出资源同样也是切换两个图像(目前不支持多于两个图像的切换),并且使这两个图像以淡入淡出效果进行切换。如10.6.7小节中的开关电灯的例子,如果加上淡入淡出效果,电灯在开关时会逐渐变亮或逐渐变暗。

在res/drawable目录中建立一个transition_lamp.xml文件,内容如下:


<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android">     <item android:drawable="@drawable/lamp_off" /> 
    <item android:drawable="@drawable/lamp_on" /> 
</transition>  

  注意,只能有两个item标签!
  布局文件中添加:

<ImageView        android:contentDescription="@null"        android:id="@+id/iv_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/transition_lamp" />  
代码中调用:

/**     * 从第一个图像切换到第二个图像:     * TransitionDrawable.startTransition(int durationMillis):
     * @param v
     */
    public void turnOn(View v) {
    	TransitionDrawable tDrawable = (TransitionDrawable) mTestIv.getDrawable();
        tDrawable.startTransition(1000);
	}
    
    /**
     * 从第二个图像切换到第一个图像:
     * TransitionDrawable.reverseTransition(int durationMillis):
     * @param v
     */
    public void turnOff(View v) {
    	TransitionDrawable tDrawable = (TransitionDrawable) mTestIv.getDrawable();
        tDrawable.reverseTransition(1000);
	}