Android 的 Drawable

全面了解 Drawable

Posted by Song on April 1, 2021

Drawable 简介

表示图像的概念,可以 XML 定义,也可以使用代码创建 Drawable 对象。Drawable 可以通过 getIntrinsicWidth 和 getIntrinsicHeight 获取内部宽高,但并不是所有的 Drawable 都有内部宽高,如 BitmapDrawable 的内部宽高就是图片的宽高,再比如 ShapeDrawable 就没有内部宽高。

Drawable 的分类

BitmapDrawable

标签为 bitmap

  • src 图片 ID,也可以是 .9 图片
  • antialias 抗锯齿
  • dither 开启抖动效果
  • filter 开启过滤效果,对图片裁剪缩放处理
  • gravity 图片定位
  • tileMode 平铺模式

ShapeDrawable

标签为 shape

  • android:shape 图形形状,rectangle(矩形),line(横线),oval(椭圆),ring(圆环)。默认是矩形。
  • <corners> 矩形四个角角度
  • <gradient> 渐变填充
  • <solid> 纯色填充
  • <stroke> shape 的描边
  • <padding>包含其 View 的空白
  • <size>设置 ShapeDrawable 的宽高,但其作为背景还是会被拉伸或缩小

LayerDrawable

标签为 layer-list,表示层次化的 Drawable,有很多 <item> 标签,<item> 标签可以包含其他任意的 Drawable

StateListDrawable

标签为 selector,表示 Drawable 集合,根据 View 状态选择合适的 Drawable。如 Button 状态改变。

LevelListDrawable

标签为 level-list,表示 Drawable 集合,根据不同的 Level,LevelListDrawable 切换不同的 Drawable。如电量、WiFi信号强度等。

TransitionDrawable

标签为 transition,实现两个 Drawable 之间淡入淡出效果。

InsetDrawable

标签为 inset,将其他 View 嵌入到自己当中,并且留一定距离。

ScaleDrawable

标签为 scale,根据自己的 Level 将 Drawable 缩放到一定的比例。

ClipDrawable

标签为 clip,根据自己 Level 来裁剪另外一个 Drawable。

自定义 Drawable

核心就是重新 Drawable 的 draw 方法,但是自定义后没法在 XML 中自定义。