View绘制画布的操作

一、canvas的几何变换

对canvas进行平移、旋转、缩放、倾斜、裁减后,canvas将不会主动恢复原状,后续绘制的操作都会在这个改变的canvas上进行

1.canvas的几何变换代码执行顺序是倒序的,如果想要先旋转再平移,那么平移代码要写在最上面,再写旋转的代码
2.对canvas进行裁减后,后续的绘制内容都在裁减的范围内进行,不在裁减范围内的内容将不会被绘制
3.反向裁减(clipOutXXX)和正向裁减相反

canvas.translate(50, 50)
/** 
 * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍 
 * 参数1: X轴的放大倍数 
 * 参数2: Y轴的放大倍数 
 */
canvas.scale(2, 4);
 
/** 
 * 在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍 
 * 参数1: X轴的放大倍数 
 * 参数2: Y轴的放大倍数 
 * 参数3: 原点X坐标
 * 参数4: 原点Y坐标
 */
canvas.scale(2, 4,100,100);
/** 
 * 原点为中心,旋转30度(顺时针方向为正方向 )
 * 参数: 旋转角度 
 */
canvas.rotate(30);
 
/** 
 * 以(100,100)为中心,旋转30度,顺时针方向为正方向 
 * 参数: 旋转角度 
 */
canvas.rotate(30,100,100);
//sx为x轴方向上倾斜的对应角度,sy为y轴方向上倾斜的对应角度,两个值都是tan值哦!
// 都是tan值!都是tan值!比如要在x轴方向上倾斜60度,那么小数值对应:tan 60 = 根号3 = 1.732!
canvas.skew(0.2f,-0.8f);
canvas.clipRect (Rect rect, Region.Op op)
二、保存和恢复画布的状态

1.当我们向保存当前画布的状态在将来恢复到这种状态时,可以通过

canvas.save()
canvas.restore();

2.canvas内部维护了一个任务栈来保存这些画布的状态,每次save操作都会向栈中放入一个canvas的状态,restore时会恢复栈顶的canvas状态

例子中 (1)会恢复到b保存的状态,(2)会恢复到a保存的状态。因为b是最新进入栈的任务,它在栈顶的位置

canvas.save()//a
canvas.translate(50,50);
canvas.save();//b
canvas.restore(); (1)
canvas.restore(); (2)

3.使用图层来绘制和保存
canvas提供了图层,可以保存这个图层的状态,并将这个状态交给canvas。

saveLayer和restoreToCount之间对canvas的几何变换状态将被保存
位置(3)处绘制的矩形将不完全,因为我们保存了一个500x500大小的图层,但是要绘制的矩形超过了这个图层的范围

int layerId = canvas.saveLayer(0,0,500,500,mPaint);
canvas.translate(50,50);
canvas.restoreToCount(layerId);
canvas.drawRect(100,100,800,800);(3)

你可能感兴趣的:(View绘制画布的操作)