Android之Drawable资源(一)
文章引用于:http://blog.csdn.net/yuzhiyuxia/article/details/8806488
Drawable的所有直接和间接子类
![](https://img.haomeiwen.com/i1837043/86ddb09c9598e989.png)
![](https://img.haomeiwen.com/i1837043/edb166ee83afcfbc.png)
![](https://img.haomeiwen.com/i1837043/cb81bd629f5a2f9f.png)
![](https://img.haomeiwen.com/i1837043/29b1fed7d3c7bea2.jpg)
我们看到Drawable是一个抽象类(abstract class),它有好多子类(SubClass),直接的(Direct)或间接的(Indirect)来操作具体Drawable类型的资源,比如BitmapDrawable是用来操作位图,ColorDrawable用来操作颜色。
1、图片资源
图片资源是简单的Drawable资源,目前Android支持的图片格式有:gif、png、jpg等。我们只需要把图片资源放置在res\mipmap目录中,那么在编译后的R类中就会生成图片资源的资源ID。
我们在程序中就可以通过调用相关的方法来获取图片资源(程序中如果要访问drawable_resource_file_name,那么可以如此:[packagename].R.drawable.drawable_resource_file_name)。
以下代码片段演示了如何访问一个图片资源
![](https://img.haomeiwen.com/i1837043/302a1703837ae2c7.jpg)
2、StateListDrawable资源
StateListDrawable内可以分配一组Drawable资源,StateListDrawable被定义在一个XML文件中,以<selector>元素起始。其内部的每一个Drawable资源内嵌在<item>元素中。
当StateListDrawable资源作为组件的背景或者前景Drawable资源时,可以随着组件状态的变更而自动切换相对应的资源,例如,一个Button可以处于不同的状态(按钮按下、获取焦点)
我们可以使用一个StateListDrawable资源,来提供不同的背景图片对于每一个状态,当组件的状态变更时,会自动向下遍历StateListDrawable对应的xml文件来查找第一个匹配的Item。
StateListDrawable资源所支持的组件状态如下所示:
![](https://img.haomeiwen.com/i1837043/37da6338e60754e1.png)
以下代码片段是一个StateListDrawable资源的XML文件描述样例:
XML文件存储在:res/drawable/button_statelist.xml
![](https://img.haomeiwen.com/i1837043/7cad47542e6e8800.jpg)
以下是Button的Layout文件:
![](https://img.haomeiwen.com/i1837043/1cef866cfb77a857.jpg)
当然我们也可以通过代码来设置Button的背景图片:
![](https://img.haomeiwen.com/i1837043/3956459ea6b801b9.jpg)
3、ShapeDrawable资源
ShapeDrawable资源绘制一个特定的形状,比如矩形、椭圆等。如果你想要自己动态的绘制二位图形,那么我们就可以使用ShapeDrawable资源对象,用ShapeDrawable,我们可以绘制我们所能想象的形状。一个ShapeDrawable需要一个Shape对象来管理呈现资源到UI Screen,如果没有Shape设置,那么会默认使用RectShape对象。
ShapeDrawable被定义在一个Xml文件中,以<shape>元素起始。其内部的每一个Drawable资源内嵌在<item>元素中
以下代码片段便是一个ShapeDrawable的XML定义
![](https://img.haomeiwen.com/i1837043/bb1efaab8cff29d1.jpg)
我们可以使用ShapeDrawable来设置组件的背景色(setBackgroundDrawable()方法),如上的代码片可以设置一个TextEdit的背景为蓝色的椭圆形状。当然我们也可以绘制自定义的View。
我们构建自定义形状的View时,由于ShapeDrawable有其自己的draw()方法,我们可以构建一个View视图的子类,如下代码片段是一个样例:
![](https://img.haomeiwen.com/i1837043/f3193b5c5699631f.jpg)
基于上述代码我们可以在Activity中构建自定义视图:
![](https://img.haomeiwen.com/i1837043/3b41e6a598f5bf5c.jpg)
当然我们也可以使用XML文件来描述:自定义的Drawable类必须重载View(Context,AttributeSet)构造函数。接着我们添加Layout文件如下:
![](https://img.haomeiwen.com/i1837043/143c7f4a238a144c.jpg)
4、ClipDrawable
ClipDrawable资源定义在一个XML中,表示裁剪(Clips)一个其他资源基于ClipDrawable资源的Level。你可以控制裁剪的Drawable的宽度、高度及gravity属性,ClipDrawable常常被用来作为一个progressbars的实现。
以下样例是一个ClipDrawable资源:
![](https://img.haomeiwen.com/i1837043/03cefa8235c4b579.jpg)
下面的ImageView布局文件应用ClipDrawable资源:
![](https://img.haomeiwen.com/i1837043/a4838754b6c35853.jpg)
下面的代码获取Drawable并且增加其裁剪,以便于渐增的显示图像
![](https://img.haomeiwen.com/i1837043/d216b840386cff72.jpg)
注意:默认的level值是0,表示图片呗这个裁剪,故图片是不可见的。当值达到10000是代码裁剪为0,图片可以完全显示。
5、AnimationDrawable
AnimationDrawable通过定义一系列的Drawable对象构建一个基于帧的动画(frame-by-frame animations),可以被用来作为视图的背景色。
最简单的构建一个帧动画的方法是在XML文件中构建一个动画,我们可以设定动画作为视图的背景色,通过调用AnimationDrawable.satrt()方法来进行动画。
如下代码片段是一个AnimationDrawable资源的XML文件,资源文件位置:res\drawable\spin_animation.xml
![](https://img.haomeiwen.com/i1837043/4883f7037cdd8b58.jpg)
我们可以看到,AnimationDrawable资源文件以<animation-list>元素为根,包含一系列的<item>节点,每一个节点定义了一个帧(frame)及持续时常。
上述动画运行了三个帧,通过设置android:oneshot属性(attribute)为true,动画会循环一次并停留在最后一帧。如果为false,那么会轮询(loop)的运行动画。
我们可以通过编码来加载播放动画:
![](https://img.haomeiwen.com/i1837043/45e27dd854dc28e0.jpg)
注意:AnimationDrawable.start()方法不能够在Activity的onCreate()方法中调用,因为AnimationDrawable还未完全的附加(attached)到Window,如果你不需要交互而立即播放动画,那么可以在onWindowFocusChanged()方法中,这个方法会在你的Activity Windows获取焦点时触发。