Drawable 是 一个通用抽象类,代表了“可以绘制的东西”。通常会将 Drawable 作为从资源中检索的类型,用于在屏幕上绘制内容。Drawable 类提供了一个通用的 API 来处理可能采取多种形式的底层视觉资源。与 View 不同,Drawable 没有处理事件或与用户交互的能力。
除了简单的绘制之外,Drawable 还为客户端提供了许多通用机制来与正在绘制的内容进行交互:
- setBounds(Rect) :告诉 Drawable 它在哪里绘制以及它应该有多大。所有 Drawable 都应该尊重请求的大小,通常通过缩放其图像来实现。另外通过 getIntrinsicHeight() 和 getIntrinsicWidth() 方法可以找到某些 Drawable 的首选大小。
- getPadding(Rect): 从某些 Drawable 中返回有关如何框定放置在它们内部的内容的信息。
- setState(int[]): 告诉 Drawable 在哪个状态下绘制,例如“焦点状态”、“选择状态”等。某些 Drawable 可能会根据所选状态修改其图像。
- setLevel(int): 方法提供一个单一的连续控制器,该控制器可以修改 Drawable 的显示方式,例如电池电量或进度级别。某些 Drawable 可能会根据当前级别修改其图像。
- Callback 接口:Drawable 可以通过调用回调接口来执行动画。一个简单的方式是通过系统工具,比如 View.setBackground(Drawable) 和 ImageView。
1. Drawable 类简介
1.1 特性
Drawable
是一个抽象类,不能直接实例化。Drawable
可以被用来绘制各种形状、图像、颜色块,甚至动画。Drawable
通常用于显示在ImageView
、Button
、TextView
等控件中,用作背景、状态指示器等。
1.2 常见子类
Drawable
类有许多子类,每个子类实现了特定的绘制行为。以下是一些常见的子类:
- BitmapDrawable:用于绘制位图(
Bitmap
)。 - ShapeDrawable:用于绘制基本的几何形状,如矩形、圆形、椭圆形等。
- ColorDrawable:用于绘制纯色块。
- GradientDrawable:用于绘制带有渐变效果的图形。
- LayerDrawable:用于组合多个
Drawable
对象进行层叠绘制。 - StateListDrawable:用于根据不同的状态(例如按下、选中)显示不同的
Drawable
。 - VectorDrawable:用于绘制矢量图形,可以缩放而不失真。
- NinePatchDrawable:用于绘制
.9.png
文件,这是一种特殊的位图,允许九宫格拉伸。
1.3 Drawable 示例
下面是一个StateListDrawable的使用示例,其用于根据不同的状态(例如按下、选中)显示不同的 Drawable
:
private fun createStateListDrawable(normalColor: Int, pressedColor: Int, cornerRadius: Float): StateListDrawable {
val stateListDrawable = StateListDrawable()
val normalDrawable = createRoundedRectangleDrawable(normalColor, cornerRadius)
val pressedDrawable = createRoundedRectangleDrawable(pressedColor, cornerRadius)
stateListDrawable.addState(intArrayOf(android.R.attr.state_pressed), pressedDrawable)
stateListDrawable.addState(intArrayOf(), normalDrawable) // Default state
return stateListDrawable
}
private fun createRoundedRectangleDrawable(color: Int, cornerRadius: Float): GradientDrawable {
return GradientDrawable().apply {
shape = GradientDrawable.RECTANGLE
setColor(color)
cornerRadii = floatArrayOf(
cornerRadius, cornerRadius, // Top left radius
cornerRadius, cornerRadius, // Top right radius
cornerRadius, cornerRadius, // Bottom right radius
cornerRadius, cornerRadius // Bottom left radius
)
}
}
使用它:
kotlin.runCatching {
val normalColor = Color.parseColor("#FF6647") // 正常状态的颜色
val pressedColor = Color.parseColor("#4DFF6647") // 按下状态的颜色
val cornerRadius = ScreenUtil.dp2px(context, 20f).toFloat() // 圆角半径(以像素为单位)
val buttonBackground = createStateListDrawable(normalColor, pressedColor, cornerRadius)
btnView.background = buttonBackground
}
2、自定义Drawable
当系统提供的 Drawable 子类无法满足需求时,可以通过继承 Drawable 类来自定义绘制行为。通过自定义 Drawable,你可以完全控制如何绘制内容,例如绘制特殊的形状、图案或实现复杂的图形效果。
- 自定义
Drawable
的应用场景
- 自定义按钮背景:通过自定义
Drawable
,你可以为按钮实现复杂的背景效果,比如渐变色、阴影效果等。 - 复杂图形绘制:例如,你想绘制一个圆形内嵌着特定图案的图形。
- 状态响应式绘制:可以结合
StateListDrawable
实现响应式的自定义绘制行为。
3. 结论
Drawable
是 Android 中强大的绘制工具,它通过抽象类的方式允许开发者对绘制内容进行深度定制。通过继承 Drawable
类,你可以根据项目的需求绘制任意形状、效果或图案。掌握 Drawable
的自定义技巧,将有助于提升应用的 UI 表现力,并实现高定制化的视觉效果。