什么是Drawable
Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念。它种类繁多,都表示一种图像的概念。Drawable一般都是通过XML的方式来定义,也可以通过代码的方式来创建具体的Drawale对象,但是代码创建会稍显复杂。在Android设计中,Drawable是一个抽象类,是所有Drawable对象的基类,每个具体的Drawable都是它的子类。
Drawable通过getIntrinsicWidth和getIntrinsicHeight两个方法来获取Drawable内部的宽/高参数。但是不是所有的Drawable都有内部宽高。比如图片形成的Drawable有,颜色所形成的Drawable无内部宽高概念。
放一张Drawable层次图:

Drawable的分类
1、BitmapDrawable(<bitmap>标签)
表示一张图片。
2、ShapeDrawa(<shap>标签)
可以理解为通过颜色来构造的图形,可以为纯色,也可以为渐变色
3、LayerDrawable(<layer-list>标签)
表示一种层次化的Drawable集合
4、StateListDrawable(<selector>标签)
也表示一种集合,根据View的状态选择合适Drawable。常用于Button
5、LevelListDrawable(<level-list>标签)
表示一个Drawable集合,根据等级显示对应等级的Drawable
6、TransitionDrawab (<transition>标签)
用于实现两个Drawable之间的淡入淡出效果。
7、InsetDrawable(<inset>标签)
可以将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距(类似于padding或margin效果)
8、ScaleDrawable(<scale>标签)
根据level来指定Drawable的缩放比例。ScaleDrawable的级别越大,内部Drawable看起来就越大;如果ScaleDrawable的XML中所定义的缩放比例越小,内部Drawable看起来就越小。
9、ClipDrawable(<clip>标签)
根据level来剪裁另一个Drawable。level为0~10000,0表示完全裁剪,即整个Drawable不可见,而10000表示不裁剪。
自定义Drawable 自定义Drawable无法在XML中使用,因此不常用。