Drawable 解析
基本概念
Drawable是一个抽象类,表示的是一个图像的概念。每一个具体的Drawable都是其子类。
优点:
- 使用简单,比自定义
View的成本要低。 - 非图片类型的
Drawable占用空间较小,可以有效的减少apk的大小。
内部宽/高:
Drawable有个参数比较重要,就是内部宽/高,通过getIntrinsicWidth和getIntrinsicHeight方法获得。
但是并不是所有的Drawable都有这两个参数,比如纯颜色的Drawable就没有内部宽/高的概念,它的两个值都为-1,它的大小就是View的大小,而图片类型的Drawable的内部宽/高决定了这个图片的固定大小。
Drawable的分类
Drawable的子类有许多,这里简单的说几个,具体的参数参考《Android开发艺术探索》Page 244。
BitmapDrawable表示一张图片。
NinePatchDrawable表示一个.9格式的图片。
ShapeDrawable表示通过颜色(纯色、渐变色)来表示的图形。
LayerDrawableXML中的标签为<layer-list>,表示的是一组层次化的Drawable集合,最终的效果是由上到下的Drawable的效果依次叠加。StateListDrawableXML中的标签为<selector>,表示一个Drawable集合,每个Drawable对应着View的一种状态,系统会根据View的不同状态更换不同的Drawable。常见的使用场景为Button的按下与弹起。LevelListDrawableXML中对应的标签为<level-list>,表示的是一个Drawable集合,其中的每一个Drawable都有一个等级(level)的概念,系统在不同的level下自动更换为不同的Drawable。TransitionDrawableXML中对应的标签为<transition>,其作用是实现两个Drawable之间的淡入淡出效果。InsetDrawableXML中对应的标签为<inset>,可以将其他的Drawable内嵌到自己的Drawable中,并在四周留出一定的空间。其最终显示效果为内嵌的Drawable的显示范围相较于不使用InsetDrawable时变小。ScaleDrawableXML中对应的标签为<scale>,其可以根据自身Drawable所设置的等级(level)对其内部的Drawable实现缩放的效果。当其
level为0时,其内部的Drawable为不可见状态;为非0的值时,按照XML中的写入的缩放比例进行显示。level的值默认为0,需要在代码中自行赋值,**系统内部约定Drawable的等级范围为0-10000**。ClipDrawableXML中对应的标签为<clip>,可以根据自己当前的等级(level)来裁剪另一个Drawable,裁剪的方向可以通过android:clipOrientation和android:gravity共同限制。当其
level的值为0时,表示完全裁剪,即整个Drawable变为不可见的状态;当level的值设置为10000时,表示不裁剪;当
level的值设置为8000时,表示裁剪了2000的区域,即裁剪20%。
自定义Drawable
Drawable的使用场景很少,通常用在View的背景和作为ImageView中的图片两个场景。
由于自定义的Drawable无法在XML中使用,但是我们可以有其他轻便的方法来自定义Drawable。
通过View的工作原理可以知道,系统通过Drawable的draw方法来绘制View的背景,所以我们可以继承Drawable并重写Drawable的draw方法来实现自定义Drawable。