一. 前言

1. 画布状态

当前画布经过的一系列操作。

2. 状态栈

存放画布状态和图层的栈(后进先出)。

3. 画布的构成

由多个图层构成。

注意:在画布上操作 = 在图层上操作,如无设置,绘制操作和画布操作是默认在默认图层上进行。在通常情况下,使用默认图层就可满足需求;若需要绘制复杂的内容(如地图),则需使用更多的图层。最终显示的结果 = 所有图层叠在一起的效果。

二. 保存当前画布状态

1. 作用

保存画布状态(即保存画布的一系列操作)。

2. 应用场景

画布的操作是不可逆的,而且会影响后续的步骤,假如需要回到之前画布的状态去进行下一次操作,就需要对画布的状态进行保存和回滚。

3. 具体使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//方法1:
//保存全部状态
public int save ()

//方法2:
//根据saveFlags参数保存一部分状态
//使用该参数可以只保存一部分状态,更加灵活
public int save (int saveFlags)

//saveFlags参数说明:
//1.ALL_SAVE_FLAG(默认):保存全部状态
//2. CLIP_SAVE_FLAG:保存剪辑区
//3. CLIP_TO_LAYER_SAVE_FLAG:剪裁区作为图层保存
//4. FULL_COLOR_LAYER_SAVE_FLAG:保存图层的全部色彩通道
//5. HAS_ALPHA_LAYER_SAVE_FLAG:保存图层的alpha(不透明度)通道
//6. MATRIX_SAVE_FLAG:保存Matrix信息(translate, rotate, scale, skew)
//每调用一次save(),都会在栈顶添加一条状态信息(入栈)

三. 回滚上一次保存的状态

1. 作用

恢复上一次保存的画布状态。

2. 具体使用

1
2
// 采取状态栈的形式。即从栈顶取出一个状态进行恢复。
canvas.restore();

四. 回滚指定保存的状态

1. 作用

恢复指定状态;将指定位置以及以上所有状态出栈。

2. 具体使用

1
2
//弹出 3、4、5的状态,并恢复第3次保存的画布状态
canvas.restoreToCount(3) ;

五. 获取保存的次数

1. 作用

获取保存过图层的次数。即获取状态栈中保存状态的数量。

2. 具体使用

1
2
3
//以上面栈为例,则返回5
//注:即使弹出所有的状态,返回值依旧为1,代表默认状态。(返回值最小为1)
canvas.getSaveCount();

六. 总结

对于画布状态的保存和回滚的套路,一般如下:

1
2
3
4
5
6
7
8
9
10
//步骤1:保存当前状态
//把Canvas的当前状态信息入栈
save();

//步骤2:对画布进行各种操作(旋转、平移Blabla)
...

//步骤3:回滚到之前的画布状态
//把栈里面的信息出栈,取代当前的Canvas信息
restore();