Android应用资源可分为两大类:
1、无法直接访问的原生资源,保存在asset目录下,应用程序可以使用AssetManager来访问这些资源
2、可以通过R资源清单类访问的资源,保存在res目录下
先来看原生资源,指的就是跟android无任何关系可以独立存在的文件,在android项目中经常放置的位置有:asset目录、/res/raw/目录、/res/xml/目录(该目录只放xml)。
获取这些地方的原声资源的方法:
asset:
AssetManager am = getAssets(); //获取该应用的AssetManagerAssetFileDescriptor afd = am.openFd("shot.mp3"); //获取指定文件对应的AssetFileDescriptorMediaPlayer mediaPlayer = new MediaPlayer();mediaPlayer.setDataSource(afd.getFileDescriptor()); //使用MediaPlayer加载指定的声音文件
/res/raw/目录:
Android SDK会在R清单类中为该目录下的资源生成一个索引项
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.bomb);
或者 java代码中通过调用Resources的openRawResource(int id)方法来获取该资源的二进制输入流。
/res/xml/目录:
通过getXml(int id)获取XmlResourceParser,通过XmlResourceParser对该xml进行pull解析
也可以通过openRawResource(int id)获取对应的输入流进行操作。
看完了原生资源之后,接下来我们分析一下Android应用资源,存放的路径为/res/路径下的各个子目录
非原生资源中的资源根据标签又可以分为两类:resource资源和非resrouce资源
其中,resource资源中存放各种简单的xml文件,包括字符串值、整数值、颜色值、数组等一个简单的常量。
而非resource资源包括很多种,他们和resource的区别就是这一类文件可以说是一个组合的效果,是带有逻辑在里面的,不像resource资源就一简单常量。
resource资源包括:string、color、array、style、dimen、boolean、integer...
非resource资源包括:anim、color、drawable、menu(这里的color和上面的color的区别是此处的color文件不是一个些简单的常量组合成,而是带有逻辑关系)
resource资源很简单,所有的父标签统一是<resource>,只是不同的资源对应的子标签不同,统一的格式如下:
<resource> <子标签名 name="xxx">xxx</子标签名> ...... ......</resource>
array资源的每个子标签下面还有一些<item>标签,作为数组的值。
下面我们关键来看非resource资源:
AnimationDrawable,该资源可放置在/res/anim/路径下。
动画资源的父标签<set>,有四个子标签可以指定:<alpha>、<scale>、<translate>、<rotate>,在指定rotate的时候要设置pivotX和pivotY为变换的“中心点”
使用也非常简单:
Animation anim = AnimationUtils.loadAnimation(context,R.anim.my_anim);
StateListDrawable,用于组织多个Drawable对象,当使用该资源的时候,StateListDrawable对象所显示的Drawable对象会随着目标组件状态的改变而自动切换
该资源的父标签<selector>,可以包含多个子标签<item>,该子标签可以指定如下属性:
1、android:color或者android:drawable
2、android:state_xxx,指定一个特殊状态
<selector xmlns:android=http://schemas.android.com/apk/res/android> <item android:color="hex_color" android:state_pressed=["true" | "false"]/></selector>
LayerDrawable,可以包含一个Drawable数组,系统会按这些Drawable对象的数组顺序来绘制他们,索引最大的Drawable对象将会被绘制在最上面
该资源的父标签<layer-list>,可以包含多个子标签<item>,该子标签可以指定如下属性:
1、android:drawable
2、android:id
3、android:buttom | top | left | right,用于指定一个长度值,用于指定将该Drawable对象绘制到目标组件的指定位置。
<layer-list xmlns:android=http://schemas.android.com/apk/res/android> <item android:id="@android:id/background" androdi:drawable="@drawable/grow"/> ...... <item> <bitmap android:src="@drawable/icon" android:gravity="center"/> </item> ....</layer-list>
ShapeDrawable,用于定义一个基本的几何图形的形状和属性
该资源的父标签<shape>,可以指定属性:android:shape=["rectangle" | "oval" | "line" | "ring"],可以包含多个子标签<corners>、<gradient>、<padding>、<size>、<solid>、<stroke>,该子标签可以指定如下属性:
定义ShapeDrawable对象的完整语法格式如下:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape=["rectangle" | "oval" | "line" | "ring"]> <!-- 定义几何图形的四个角的弧度--> <corners android:radius="integer" android:topLeftRadius="integer" android:topRightRadius="integer" android:bottomLeftRadius="integer" android:bottomRightRadius="integer"/> <!--定义使用渐变色填充 --> <gradient android:angle="integer" android:centerX="integer" android:centerY="integer" android:centerColor="integer" android:endColor="color" android:gradientRadius="integer" android:startColor="color" android:type=[ " linear" | "radial" | "sweep"] android:useslevel=["true" |"false"]/> <!-- 定义几何形状的内边框 --> <padding android:left="integer" android:top="integer" android:right="integer" android:bottom="integer"/> <!-- 定义几何图形的大小 --> <size android:width="integer" android:color="color" android:dashWidth="integer" android:dashGap="integer"/> <!-- 定义使用单种颜色填充 --> <solid android:color="color"/> <!-- 定义为几何图形绘制边框 --> <stroke android:width="integer" android:color="color“ android:dashWidth="integer" android:dashGap="integer"/></shape>
ClipDrawable资源,代表从其他为图上截取的一个“图片片断”,使用标签<clip>可以指定如下属性:
1、android:drawable,指定截取的源drawable对象
2、android:clipOrientation,指定截取方向
3、android:gravity,指定截取时对齐方式
使用ClipDrawable对象时,可调用setLevel(int level)方法来设置截取的区域大小,当level为0时,截取的图片片断为空;当level为10000时,截取整张图片
菜单资源,通常放在/res/menu/目录下,父标签为<menu>,且无需指定任何属性,可以包含如下子标签:
1、<item>
a、android:id
b、android:title
c、android:icon
d、android:alphabeticShortCut,为菜单项指定字符快捷键
e、android:numericShortCut,为菜单项指定数字快捷键
f、android:checkable,设置该菜单项是否可选
g、android:checked,设置该菜单项是否已选中
h、android:visible
i、android:enable
2、<group>,可以包含多个<item>
3、checkableBehavior指定菜单的选择行为,可选择none、all、single
4、visible
5、enable