Android | 了解Drawable绘制资源基础(一)

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 通常用于显示在 ImageViewButtonTextView 等控件中,用作背景、状态指示器等。

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 的应用场景
  1. 自定义按钮背景:通过自定义 Drawable,你可以为按钮实现复杂的背景效果,比如渐变色、阴影效果等。
  2. 复杂图形绘制:例如,你想绘制一个圆形内嵌着特定图案的图形。
  3. 状态响应式绘制:可以结合 StateListDrawable 实现响应式的自定义绘制行为。

3. 结论

Drawable 是 Android 中强大的绘制工具,它通过抽象类的方式允许开发者对绘制内容进行深度定制。通过继承 Drawable 类,你可以根据项目的需求绘制任意形状、效果或图案。掌握 Drawable 的自定义技巧,将有助于提升应用的 UI 表现力,并实现高定制化的视觉效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小马快跑_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值