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 | 实现复杂图形、波浪线、贝塞尔曲线、剪裁区域 |