Android的Drawable

来源:互联网 发布:女变男网络电影 编辑:程序博客网 时间:2024/05/20 04:11

Android的Drawable

  • 简介

用来表示图像,在实际开发中用于作View的背景,一般宽高没有大小概念,会被拉伸或缩放至View的同等大小,比自定义的View成本低,一般用XML定义。


  • 分类

    1. BitmapDrawable ( 标签: )
      表示一张图片(图片可以是.9图)。可以直接引用,也可以xml描述它,设置其它效果,如gravity,filter等。

    2. ShapeDrawable ( 标签: )
      用颜色构造图形,可以纯色也可以渐变。在xml定义,如shape,corners,padding等设置效果。
      注意:size有两个属性android:width和android:height设置 了,可以通过Drawable的getIntrinsicWidth和getIntrinsicHeight可以获取到,没设置返回-1,但是作为View的背景时,shape还是会被拉伸或者缩小为View的大小。

    3. LayerDarwable ( 标签: )
      表示层次化的Drawable集合,可以包含多个item,每个item表示一个Drawable,item可以引用已有的Drawable资源,也可以自定义,如ShapeDrawable,下面的item会覆盖上面的item。实现特殊的叠加效果。

    4. StateListDrawable ( 标签: )
      表示Drawable集合,每个Drawable对应着View的一种状态,主要用于设置可单击的View的背景,如获取焦点,按压等状态,系统会根据View当前的状态从selector中选择对应的item,每个item对应一个Drawable,系统从上到下的顺序查找,直至查找到第一条匹配的item,一般,默认的item放在最后面。

    5. LevelListDrawable ( 标签: )
      表示Drawable集合,每个Drawable都有等级的概念,每个item对应一个Drawable,并且有等级范围,可以设置最大值和最小值,可以通过Drawable的setLevel方法去设置不同的等级从而切换具体的Drawable。

    6. TransitionDrawable (标签:)
      只能有两个item,用于实现两个Drawable之间的淡入淡出效果,通过它的startTransition和reverseTransition方法来实现淡入淡出的效果以及它的逆过程。

    7. InsetDrawable (标签: )
      将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现。layerDrawable也是可以达到相同的预期效果的。

    8. 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))。

    9. ClipDrawable(标签:)
      可以根据自己当前的等级(level)来裁剪另一个Drawable,裁剪方向可以通过android:clipOrientation和android:gravity这两个属性来共同控制,Drawable的等级(level)是有范围的,即0~10000,比如将等级设置为8000,表示按裁剪方向裁剪了20%的区域,即裁剪后为原图的80%。

    10. 自定义Drawable
      继承自Drawable,重写draw方法。setAlpha、setColorFilter、getOpacity、draw这几个方法是必须实现的,自定义Drawable实现圆形、圆角图片,可以作为任何View的背景。getIntrinsicWidth、getIntrinsicHeight当自定义的Drawable有固定大小时重写,主要是为了在View使用wrap_content的时候,提供一下尺寸,默认为-1,setBounds方法是去设置下绘制的范围。


  • 参考

Android开发艺术探索;

领略千变万化的Android Drawable (一)

领略千变万化的Android Drawable (二)

Android Drawable 那些不为人知的高效用法

原创粉丝点击