Drawable 解析
基本概念
Drawable
是一个抽象类,表示的是一个图像的概念。每一个具体的Drawable
都是其子类。
优点:
- 使用简单,比自定义
View
的成本要低。 - 非图片类型的
Drawable
占用空间较小,可以有效的减少apk
的大小。
内部宽/高:
Drawable
有个参数比较重要,就是内部宽/高,通过getIntrinsicWidth
和getIntrinsicHeight
方法获得。
但是并不是所有的Drawable
都有这两个参数,比如纯颜色的Drawable
就没有内部宽/高的概念,它的两个值都为-1
,它的大小就是View
的大小,而图片类型的Drawable
的内部宽/高决定了这个图片的固定大小。
Drawable
的分类
Drawable
的子类有许多,这里简单的说几个,具体的参数参考《Android开发艺术探索》Page 244。
BitmapDrawable
表示一张图片。
NinePatchDrawable
表示一个.9格式的图片。
ShapeDrawable
表示通过颜色(纯色、渐变色)来表示的图形。
LayerDrawable
XML
中的标签为<layer-list>
,表示的是一组层次化的Drawable
集合,最终的效果是由上到下的Drawable
的效果依次叠加。StateListDrawable
XML
中的标签为<selector>
,表示一个Drawable
集合,每个Drawable
对应着View
的一种状态,系统会根据View
的不同状态更换不同的Drawable
。常见的使用场景为Button
的按下与弹起。LevelListDrawable
XML
中对应的标签为<level-list>
,表示的是一个Drawable
集合,其中的每一个Drawable
都有一个等级(level
)的概念,系统在不同的level
下自动更换为不同的Drawable
。TransitionDrawable
XML
中对应的标签为<transition>
,其作用是实现两个Drawable
之间的淡入淡出效果。InsetDrawable
XML
中对应的标签为<inset>
,可以将其他的Drawable
内嵌到自己的Drawable
中,并在四周留出一定的空间。其最终显示效果为内嵌的Drawable
的显示范围相较于不使用InsetDrawable
时变小。ScaleDrawable
XML
中对应的标签为<scale>
,其可以根据自身Drawable
所设置的等级(level
)对其内部的Drawable
实现缩放的效果。当其
level
为0
时,其内部的Drawable
为不可见状态;为非0
的值时,按照XML
中的写入的缩放比例进行显示。level
的值默认为0
,需要在代码中自行赋值,**系统内部约定Drawable
的等级范围为0
-10000
**。ClipDrawable
XML
中对应的标签为<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
。