欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

画布canvas局部操作之canvas.clipRect(rect)使用,,是最近在写kyloadi

来源: 开发者 投稿于  被查看 24689 次 评论:104

画布canvas局部操作之canvas.clipRect(rect)使用,,是最近在写kyloadi



canvas.clipRect(rect)这个函数实际也是我最近才知道的,以前因为没有这方面的需要。

是最近在写kyloading这个控件时用到的。如上图。

这个loading控件包含俩个部分,不停旋转的loading图片,和下面"正在加载中..."的文字,即一个静止的,一个动态变化的。


插个小插曲,刚才发现百度的一个小功能。你在百度中输入"旋转"俩字,页面会自动旋转一周。有兴趣的可以试试。

2015-06-05_213056.png


接着回来。

如果直接旋转Bitmap的话:

// 定义矩阵对象  
Matrix matrix = new Matrix(); 
// 向左旋转45度,参数为正则向右旋转  
matrix.postRotate(-45);   
Bitmap dstbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), 500,  
                matrix, true);

由于每次都生成新的bitmap,bitmap是很占内存的,这样你有多少内存也不够,必定会报内存溢出。

所以,选用另一种方法,也是google推荐的方式,旋转画布。


kyloading.png

如上图,按照loading的中心点旋转整个画布。由于整个控件并非是正方形,圆心也并非是loading的中心,所以旋转起来loading会扭动,而不是绕中心固定旋转。

解决的办法是,如何使旋转的画布为正方形,且loading的中心与正方行的中心重合。如下图。


kyloading.png


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)以前的操作区域,因为接下来,还需要在画布上画文字"正在加载中..."



用户评论