Canvas、Paint 和 Path

20 阅读2分钟

Canvas、Paint 和 Path 是 Android 自定义绘制系统的三大核心类,也是系统所有控件(包括 ImageView、TextView 等)在底层渲染时的基础工具。下面我分别讲清楚它们的 用途、使用场景,以及你提出的核心问题 ✅

一、Canvas:画布(用于绘制)

  • 作用:提供一块“画布”,你可以在上面画各种图形(圆、线、文字、图片等)。

  • 常见方法

    • drawLine()
    • drawRect()
    • drawCircle()
    • drawText()
    • drawBitmap()
    • drawPath()

🧠 可以理解为:Canvas 就是一个用来承载绘制命令的 画布对象,它由系统传入 onDraw(Canvas) 方法中。

二、Paint:画笔(控制样式)

  • 作用:用于描述“怎么画”,包括颜色、线宽、抗锯齿、阴影、文字大小等。

  • 常见用法

    • paint.color = Color.RED
    • paint.strokeWidth = 4f
    • paint.style = Paint.Style.STROKE / FILL
    • paint.setShadowLayer(...)

🧠 可以理解为:Paint 决定了你用什么样的“画笔”来在 Canvas 上涂色。

三、Path:路径(描述形状)

  • 作用:用于描述一组连接的线、曲线、圆角等几何图形路径,最后交给 Canvas.drawPath() 画出来。
  • 常见方法
    • moveTo(x, y):起点
    • lineTo(x, y):画线
    • quadTo(...) / cubicTo(...):贝塞尔曲线
    • addCircle() / addRoundRect():快速添加路径图形
    • reset():清空路径

🧠 可以理解为:Path 是“路径蓝图”,你可以先规划出形状,然后一次性交给 Canvas 来绘制。

四、它们之间的关系是?

override fun onDraw(canvas: Canvas) {
    val paint = Paint().apply {
        color = Color.BLUE
        style = Paint.Style.FILL
    }

    val path = Path().apply {
        moveTo(0f, 0f)
        lineTo(100f, 0f)
        lineTo(50f, 100f)
        close()
    }

    canvas.drawPath(path, paint)
}

🧩 总结:Path 规划形状 → Paint 决定样式 → Canvas 负责绘制

五、系统控件也用它们吗?

✅ 是的,所有系统控件(如 TextView、ImageView、Button)底层都是通过 Canvas + Paint 绘制出来的,区别只在于系统封装好了这些绘制逻辑。比如:

  • TextView → 用 Canvas.drawText() 画文字
  • ImageView → 用 Canvas.drawBitmap() 画图片
  • RecyclerView 分隔线 → 用 Canvas.drawLine() 或 drawRect()

自己实现的 View 也可以通过重写 onDraw(Canvas) 来完全自定义它的样子。

使用场景举例

使用场景
Canvas绘制图形、图片、文本、动画、组合绘制
Paint控制颜色、边框、阴影、文字大小、描边
Path实现复杂图形、波浪线、贝塞尔曲线、剪裁区域