一. 前言

Canvas-画布,是一种绘制时的规则。画布只是绘制时的规则,但内容实际上是绘制在屏幕上的。

二. 基础

1. Paint类

自定义View-绘制文本

2. Path类

自定义View-Path

三. 创建 & 获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 方法1
// 利用空构造方法直接创建对象
Canvas canvas = new Canvas();

// 方法2
// 通过传入装载画布Bitmap对象创建Canvas对象
// CBitmap上存储所有绘制在Canvas的信息
Canvas canvas = new Canvas(bitmap)

// 方法3
// 通过重写View.onDraw()创建Canvas对象
// 在该方法里可以获得这个View对应的Canvas对象
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//在这里获取Canvas对象
}

// 方法4
// 在SurfaceView里画图时创建Canvas对象
SurfaceView surfaceView = new SurfaceView(this);
// 从SurfaceView的surfaceHolder里锁定获取Canvas
SurfaceHolder surfaceHolder = surfaceView.getHolder();
//获取Canvas
Canvas c = surfaceHolder.lockCanvas();
// ...(进行Canvas操作)
// Canvas操作结束之后解锁并执行Canvas
surfaceHolder.unlockCanvasAndPost(c);

官方推荐方法4来创建并获取Canvas,原因:

  • SurfaceView里有一条线程是专门用于画图,所以方法4的画图性能最好,并适用于高质量的、刷新频率高的图形。

  • 而方法3刷新频率低于方法3,但系统花销小,节省资源。

四. 绘制方法

1. 绘制颜色

① drawColor

② drawRGB

③ drawARGB

自定义View-绘制颜色

2. 绘制基本图形

① 点

② 线

③ 矩形

④ 圆角矩形

⑤ 圆弧

⑥ 圆

⑦椭圆

自定义View-绘制基本图形

3. 绘制图形

① 绘制图片

② 绘制位图

自定义View-绘制图片

4. 绘制文字

① 绘制文字drawText

② 绘制文字时指定每个文字的位置drawPosText

③ 根据路径绘制文字drawTextOnPath

自定义View-绘制文本

5. 绘制路径

① drawPath

② 贝塞尔曲线

自定义View-Path

6. 画布操作

① 画布裁剪

1> 裁剪路径 clipPath

2> 裁剪矩形 clipRect

3> 裁剪区域 clipRegion

自定义View-画布裁剪

② 画布变换

1> 位移 translate

2> 缩放 scale

3> 旋转 rotate

4> 错切 skew

自定义View-画布变换

③ 画布快照

1> 保存当前状态 save

2> 回滚到上一次保存的状态 restore

3> 保存图层状态 saveLayerXxx

4> 滚回到指定状态 restoreToCount

5> 获取保存次数 getSaveCount

自定义View-画布快照

参考文章

Canvas类的最全面详解 - 自定义View应用系列