Android进阶知识(十七):Android的Drawable
一、Drawable简介
Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念,其种类很多,最常见的颜色和图片都可以是一个Drawable。
在实际开发中,Drawable常被用来作为View的背景使用。Drawable一般通过XML定义,如我们最经常接触的在项目的目录app\src\main\res\drawable下就是XML定义的Drawable。同样可以通过代码来创建具体的Drawable对象,只是稍微复杂。
Drawable的内部宽/高这个参数很重要,通过getIntrinsicWidth和getIntrinsicHeight方法可以获取。但并不是所有的Drawable都有内部宽/高,比如一张图片所形成的Drawable其内部宽/高就是图片的宽/高,但是一个颜色所形成的Drawable没有内部宽/高的概念。
Drawable的内部宽/高不等同于它的大小,一般来说,Drawable没有大小概念,当用作View背景时,Drawable会被拉伸至View的同等大小。
二、Drawable分类
Drawable的种类繁多,常见的有BitmapDrawable、ShapeDrawable、LayerDrawable以及StateListDrawable等,下面笔者将介绍常见的几种Drawable的简介以及其对应的标签,至于具体的使用,后续也许笔者会单独做一个专门的笔记。
Drawable | 作用 | 标签 |
---|---|---|
BitmapDrawable | 表示一张图片,在实际开发中可以引用原始图片,也可以通过XML的方式来描述它 | <bitmap> |
ShapeDrawable | 通过颜色来构造图形,其既可以是纯色的图形,也可以是具有渐变效果的图形 | <shape> |
LayerDrawable | 表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层次上面从而达到一种叠加后的效果 | <layer-list> |
StateListDrawable | 表示Drawable集合,每个Drawable对应着View的一种状态,系统会根据View的状态来选择合适的Drawable | <selector> |
LevelListDrawable | 同样表示一个Drawable集合,集合中的每个Drawable都有一个对应的level,其根据不同的level来切换对应的Drawable | <level-list> |
TransitionDrawable | 用于实现两个Drawable之间的淡入淡出效果 | <transition> |
InsetDrawable | 将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距 | <inset> |
ScaleDrawable | 根据自己的等级(level)将指定的Drawable缩放到一定的比例 | <scale> |
ClipDrawable | 根据自己当前的等级(level)来裁剪另一个Drawable | <clip> |
三、自定义Drawable
Drawable的使用范围很单一,一个是作为ImageView中的图形显示,一个是作为View的背景,大多数情况下Drawable都是以View的背景这种形式出现的。
Drawable的工作原理很简单,其核心方法为draw方法,结合之前的View的工作原理不难理解。因此自定义Drawable最主要的就是重写draw方法。
另外需要注意getIntrinsicWidth和getIntrinsicHeight方法,当自定义的Drawable有固有大小时最好重写这两个方法,因为它会影响到View的wrap_content布局,比如自定义Drawable是绘制一张图片。
参考资料:《Android开发艺术探索》