Canvas 详解
今天主要将第二个,位置和形状变换
Demo
1:平移
平移之前是红色的矩形,原点位置是0,0
平移之后是灰色的矩形,原点位置是50,50
平移是将整个画布进行平移,将原点位置平移到所设置的位置,我们验证一下,在平移后的代码中再添加一个条线
绘制结果: 平移以后,再次绘制任何东西都会从平移后的原点出发
2,缩放
代码
scale缩放是将整个画布进行一个缩放操作
运行结果
还有一个重载缩放方法
运行结果
这个方法是先执行translate (200,200)的操作,然后再进行缩放
3:旋转
运行结果
运行结果:
4,倾斜操作
结果===灰色的图,就是将y轴逆时针旋转45度
接着如果让y轴旋转45度:
运行结果:y轴上倾斜45度,x轴顺时针旋转45度
5,切割
运行结果:
第一张图是注释掉//canvas.clipRect(200,200,700,700);//画布被裁剪,第二张是按照上面的执行切割,这里切割的范围就是红色正方形区域。
此时再画一个圆
canvas.drawCircle(300,300,100,mPaint);
运行结果:
可以在画一个圆,到灰色正方形范围,看看能不能显示
canvas.drawCircle(300,800,100,mPaint);
运行结果
再画一个介于两者之间的圆
canvas.drawCircle(300,700,100,mPaint);
反向裁剪
运行结果:
6:矩阵
结果就不看了 跟之前的平移,缩放,旋转都没有什么区别,只是之前是调用paint的api,现在改成了matrix
我们来尝试一下:
运行结果:
我们再让画布移动回去:
运行结果:---我们发现画布又移动回去了
可以通过状态保存来实现反向移动:
canvas.restore();可以多次调用:
例如:
结果:===保留到了第二级
结果:===返回了最初的状态
canvas内部维护了一个状态栈,没save一次就压入栈中,restore()就做出栈操作
我们可以通过方法来查询状态的个数:canvas.saveCount(); canvas.restoreCount();
我们还可以通过canvas.restoreToCount(int state)来直接返回某个状态,这个state=canvas.save()返回的,当我们返回的这个state为栈底的,那么上面的状态也会直接出栈。
2:使用离屏绘制保存画布状态
运行结果;==开始绘制的是红色的,然后将画布移动20,20,然后再绘制的灰色的矩形就是从(20,20),(700,700)的一个矩形,然后恢复画布,再绘制一个蓝色的矩形,我们可以发现,矩形又从(0,0)开始了
粒子代码大放送