Canvas的基本操作
位移(translate)
translate是坐标系的移动,可以为图形绘制选择一个合适的坐标系
1 | // 省略了创建画笔的代码 |
缩放(Scale)
缩放有两种方法
1 | public void scale (float sx, float sy) |
两个方法中前两个参数是相同的分别为x轴和y轴的缩放比例。而第二种方法比前一种多了两个参数,用来控制缩放中心位置的。
sx与sy取值
saveflages | 简介 |
---|---|
[-∞, -1) | 先根据缩放中心放大n倍,再根据中心轴进行翻转 |
-1 | 根据缩放中心轴进行翻转 |
(-1, 0) | 先根据缩放中心缩小到n,再根据中心轴进行翻转 |
0 | 不会显示,若sx为0,则宽度为0,不会显示,sy同理 |
(0, 1) | 根据缩放中心缩小到n |
1 | 没有变化 |
(1, +∞) | 根据缩放中心放大n倍 |
eg:
1 | canvas.translate(mWidth / 2, mHeight / 2); |
scale可以叠加
旋转(rotate)
有两种方法
1 | public void rotate (float degrees) |
和缩放一样,第二种方法多出来的两个参数依旧是控制旋转中心点的。
默认的旋转中心依旧是坐标原点
eg:
1 | // 将坐标系原点移动到画布正中心 |
rotate可叠加
错切
1 | public void skew (float sx, float sy) |
float sx:将画布在x方向上倾斜相应的角度,sx倾斜角度的tan值,
float sy:将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值.
变换后:
X = x + sx * y
Y = sy * x + y
eg:
1 | // 将坐标系原点移动到画布正中心 |
快照(save)和回滚(restore)
画布的操作是不可逆的,而且很多画布操作会影响后续的步骤,例如第一个例子,两个圆形都是在坐标原点绘制的,而因为坐标系的移动绘制出来的实际位置不同。所以会对画布的一些状态进行保存和回滚。
-
save把当前的画布的状态进行保存,然后放入特定的栈中
-
saveLayerXxx新建一个图层,并放入特定的栈中
-
restore把栈中最顶层的画布状态取出来,并按照这个状态恢复当前的画布
-
restoreToCount弹出指定位置及其以上所有的状态,并按照指定位置的状态进行恢复
-
getSaveCount获取栈中内容的数量(即保存次数)
-
**什么是画布和图层?**我们看到的画布是由多个图层构成的
我们的绘制操作和画布粗啊哦做都是在默认图层上进行的;
若要绘制比较复杂的内容,可以采用分图层;
- save的方法:
1 | // 保存全部状态 |
saveflags:
saveflages | 简介 |
---|---|
ALL_SAVE_FLAG | 默认,保存全部状态 |
CLIP_SAVE_FLAG | 保存剪辑区 |
CLIP_TO_LAYER_SAVE_FLAG | 剪裁区作为图层保存 |
FULL_COLOR_LAYER_SAVE_FLAG | 保存图层的全部色彩通道 |
HAS_ALPHA_LAYER_SAVE_FLAG | 保存图层的alpha(不透明度)通道 |
MATRIX_SAVE_FLAG | 保存Matrix信息( translate, rotate, scale, skew) |
每调用一次save方法,都会在栈顶添加一条状态信息;
- saveLayerXxx方法
1 | // 无图层alpha(不透明度)通道 |
-
restore方法
状态回滚;即从状态栈顶取出一个状态然后对内容进行恢复; -
restoreToCount方法
获取保存的次数,即状态栈中保存状态的数量
1 | save(); //保存状态 |
出处:http://www.gcssloop.com/customview/Canvas_Convert