笔者对canvas常用的的api做了简单的分类,概况如下:
一、save() 和 restore()
save方法是将canvas当前状态保存,save之后的操作不影响save之前的效果。restore方法是将之前save的效果重新展示出来,调用restore之前要保证调用过save否则会报异常。
另外canvas还有几个savaLayer方法和saveLayerAlpha方法,其功能与sava方法类似,都是保存原有图层,同时添加新图层(restore方法就是将这些图层摞在一起)。saveLayerAlpha方法在添加新图层的同时还为新添加的图层上的元素预设置了一个透明度,但是不影响整个图层的透明度,只是给所绘制的元素设置了透明度。
官方是不建议使用savelayer方法的,因为其太消耗性能,尤其当区域比较大时。
二、clipPath()
clipPath 是沿着指定的路径去剪裁canvas的绘制区域。其有两个方法重载,一个只有path作为参数,另一个多了个op参数。path参数不用多说,就是要裁剪的路径,op参数是亮点。op参数是个枚举参数其中的可选变量有difference、intersect、union、xor、reverse_difference、replace。分别表示不同的效果(假设第一次剪裁的区域为P1,第二次剪裁的区域为P2):
INTERSECT,INTERSECT是默认的参数,是指P2实际区域是P1和P2的交集的区域
DIFFERENCE,是指P2实际区域是P2与P1不同的地方(P1减去P1和P2的交集)
REPLACE,是指P2实际区域就是P2本身,和P1有重合的地方覆盖P1
REVERSE_DIFFERENCE,是指P2和P1不重合的区域
UNION,P1和P2的并集
XOR,P1和P2的并集减去P1和P2的交集
三、变换(平移,旋转,缩放,斜切等操作)
canvas中提供了相应的变换函数如translate,rotate,scale等,但是还可以用setMatrix方法为canvas配置相应的matrix来完成相应的变换。matrix对象当中也有相应的变换操作方法如平移(setTranslate)等。
这里要说一说canvas.setMatrix()和canvas.concat()的区别,二者的参数都是个matrix对象。setMatrix 方法是为canvas设置一个变换矩阵matrix,在设置了这个矩阵之后的所有绘制操作都会受到这个matrix的影响,直到重新调用这个方法为canvas重新设置一个变换矩阵,之后的绘制将受到这个新的变换矩阵的影响。原先的矩阵作废!对于concat方法则是在原有矩阵的基础上叠加效果,比如第一个矩阵为旋转20度,第二个矩阵为旋转40度,当调用concat设置40度的矩阵时,效果为旋转60度,而调用setMatrix 设置40度矩阵时,效果为旋转40度。
使用比较少的变换方法时skew(错切),其参数的意义为: float sx:将画布在x方向上倾斜相应的角度,sx为倾斜角度的tan值; float sy:将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值;对图像的错切变换公式为:
x = x0 + sy*y0;
y = sx*x0 + y0;
四、绘制方法
除了以上需要学习的方法之外还有一些比较容易理解的方法,比如drawBitmap等draw系列的方法。这类方法也占了其api的大多数。
五、setDrawFilter()
为canvas设置抗锯齿效果。
六、quickReject()
判断绘制区域是否没和某个矩形相交,从而可以跳过那些非矩形区域内的绘制操作。