Drawable 解析

基本概念

Drawable是一个抽象类,表示的是一个图像的概念。每一个具体的Drawable都是其子类。

优点:

  1. 使用简单,比自定义View的成本要低。
  2. 非图片类型的Drawable占用空间较小,可以有效的减少apk的大小。

内部宽/高:

Drawable有个参数比较重要,就是内部宽/高,通过getIntrinsicWidthgetIntrinsicHeight方法获得。

但是并不是所有的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实现缩放的效果。

    当其level0时,其内部的Drawable为不可见状态;为非0的值时,按照XML中的写入的缩放比例进行显示。

    level的值默认为0,需要在代码中自行赋值,**系统内部约定Drawable的等级范围为0-10000**。

  • ClipDrawable

    XML中对应的标签为<clip>,可以根据自己当前的等级(level)来裁剪另一个Drawable,裁剪的方向可以通过android:clipOrientationandroid:gravity共同限制。

    当其level的值为0时,表示完全裁剪,即整个Drawable变为不可见的状态;当level的值设置为10000时,表示不裁剪;

    level的值设置为8000时,表示裁剪了2000的区域,即裁剪20%

自定义Drawable

Drawable的使用场景很少,通常用在View的背景和作为ImageView中的图片两个场景。

由于自定义的Drawable无法在XML中使用,但是我们可以有其他轻便的方法来自定义Drawable

通过View的工作原理可以知道,系统通过Drawabledraw方法来绘制View的背景,所以我们可以继承Drawable并重写Drawabledraw方法来实现自定义Drawable


Drawable 解析
https://luoyuy.top/posts/7e6a2308252d/
作者
LuoYu-Ying
发布于
2022年4月16日
许可协议