Android的Drawable
- 简介
用来表示图像,在实际开发中用于作View的背景,一般宽高没有大小概念,会被拉伸或缩放至View的同等大小,比自定义的View成本低,一般用XML定义。
分类
BitmapDrawable ( 标签: )
表示一张图片(图片可以是.9图)。可以直接引用,也可以xml描述它,设置其它效果,如gravity,filter等。ShapeDrawable ( 标签: )
用颜色构造图形,可以纯色也可以渐变。在xml定义,如shape,corners,padding等设置效果。
注意:size有两个属性android:width和android:height设置 了,可以通过Drawable的getIntrinsicWidth和getIntrinsicHeight可以获取到,没设置返回-1,但是作为View的背景时,shape还是会被拉伸或者缩小为View的大小。LayerDarwable ( 标签: )
表示层次化的Drawable集合,可以包含多个item,每个item表示一个Drawable,item可以引用已有的Drawable资源,也可以自定义,如ShapeDrawable,下面的item会覆盖上面的item。实现特殊的叠加效果。StateListDrawable ( 标签: )
表示Drawable集合,每个Drawable对应着View的一种状态,主要用于设置可单击的View的背景,如获取焦点,按压等状态,系统会根据View当前的状态从selector中选择对应的item,每个item对应一个Drawable,系统从上到下的顺序查找,直至查找到第一条匹配的item,一般,默认的item放在最后面。LevelListDrawable ( 标签: )
表示Drawable集合,每个Drawable都有等级的概念,每个item对应一个Drawable,并且有等级范围,可以设置最大值和最小值,可以通过Drawable的setLevel方法去设置不同的等级从而切换具体的Drawable。TransitionDrawable (标签:)
只能有两个item,用于实现两个Drawable之间的淡入淡出效果,通过它的startTransition和reverseTransition方法来实现淡入淡出的效果以及它的逆过程。InsetDrawable (标签: )
将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现。layerDrawable也是可以达到相同的预期效果的。ScaleDrawable(标签:)
根据自己的等级(level)将指定的Drawable缩放到一定比例,android:scaleWidth和android:scaleHeight分别表示对指定Drawable宽和高的缩放比例,以百分比的形式表示,比如25%,等级为1的话,就是缩放了25%,缩放后为原图的75%。要将其显示出来的话,必须给ScaleDrawable设置一个大于0小于10000的等级(级别越大Drawable显示得越大,等级为10000时就没有缩放效果了,公式w -= (int) (w * (10000 -level) * mScaleState.mScaleWidth / 10000))。ClipDrawable(标签:)
可以根据自己当前的等级(level)来裁剪另一个Drawable,裁剪方向可以通过android:clipOrientation和android:gravity这两个属性来共同控制,Drawable的等级(level)是有范围的,即0~10000,比如将等级设置为8000,表示按裁剪方向裁剪了20%的区域,即裁剪后为原图的80%。自定义Drawable
继承自Drawable,重写draw方法。setAlpha、setColorFilter、getOpacity、draw这几个方法是必须实现的,自定义Drawable实现圆形、圆角图片,可以作为任何View的背景。getIntrinsicWidth、getIntrinsicHeight当自定义的Drawable有固定大小时重写,主要是为了在View使用wrap_content的时候,提供一下尺寸,默认为-1,setBounds方法是去设置下绘制的范围。
- 参考
Android开发艺术探索;