canvas.clipRect(rect)这个函数实际也是我最近才知道的,以前因为没有这方面的需要。
是最近在写kyloading这个控件时用到的。如上图。
这个loading控件包含俩个部分,不停旋转的loading图片,和下面"正在加载中..."的文字,即一个静止的,一个动态变化的。
插个小插曲,刚才发现百度的一个小功能。你在百度中输入"旋转"俩字,页面会自动旋转一周。有兴趣的可以试试。
接着回来。
如果直接旋转Bitmap的话:
// 定义矩阵对象 Matrix matrix = new Matrix(); // 向左旋转45度,参数为正则向右旋转 matrix.postRotate(-45); Bitmap dstbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), 500, matrix, true);
由于每次都生成新的bitmap,bitmap是很占内存的,这样你有多少内存也不够,必定会报内存溢出。
所以,选用另一种方法,也是google推荐的方式,旋转画布。
如上图,按照loading的中心点旋转整个画布。由于整个控件并非是正方形,圆心也并非是loading的中心,所以旋转起来loading会扭动,而不是绕中心固定旋转。
解决的办法是,如何使旋转的画布为正方形,且loading的中心与正方行的中心重合。如下图。
canvas.clipRect(RectF rect)正好能解决这个问题。
函数的功能是,设置画布的工作区域,之后,对画布的所有操作都只会对这个区域起作用。
这样,用canvas.clipRect设置一个包含loading图片的正方形区域,然后只旋转这个区域即可。
注意:虽然用canvas.clipRect重新设置画布的操作区域,但是它不会改变区域内的坐标x,y。
代码如下:
canvas.save();//保存画布状态,以便旋转后,利用canvas.restore()恢复画布的操作区域 canvas.clipRect(rect); canvas.rotate(currentdegrees, left+rect.width()/2, top+rect.height()/2); canvas.drawBitmap(this.iconBitmap, left, top, null); canvas.restore();//恢复到调用canvas.clipRect(rect)以前的操作区域,因为接下来,还需要在画布上画文字"正在加载中..."