Android 的 Drawable

全面了解 Drawable

Posted by Song on April 1, 2021

Drawable 简介

表示图像的概念,可以 XML 定义,也可以使用代码创建 Drawable 对象。Drawable 可以通过 getIntrinsicWidthgetIntrinsicHeight 获取内部宽高,但并不是所有的 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 中自定义。