不知道是我的理解能力有问题还是怎么回事,网上有很多举例说明的,我都看不懂,理解不能,而楼下还有很多的人说一目了然浅显易懂。纠结了N久,决定自己来理解一番,做个记录。
所有的操作都是通过canvas来实现的,这个的意思是说,平移、旋转、放大缩小的操作,都是直接操作canvas来实现。canvas就是一般理解的画布。导致理解错误的根源就是这里。
经常看到这样的代码:
//前期定义 Canvas canvas
canvas.drawRect(100, 100, 150, 150, p1); // p1 是红色画笔
canvas.rotate(30);
canvas.drawRect(200, 200, 250, 250, p2); // p2 是蓝色画笔
按照我一般的理解,先画了一个红色rect(100,100,150,150),然后旋转canvas 30度,再画一个蓝色rect(200,200,250,250)。
那么,由于是对canvas的操作,旋转了画布,第一个rect应该旋转了,然后画第二个rect,第二个rect应该没旋转,预估效果应该是下左图(也就是第一个方块旋转,第二个方块不旋转)。而实际效果确是下右图(第一个不旋转,第二个旋转)。
还有一个问题,图上方块的位置和代码里面的貌似也不一样,这个后面再说
然后试验了几次之后我发现,画图的canvas和显示没关系,而这个canvas又只影响你画图。
意思就是,画图,实际上是画在这个canvas定义的范围和规则下,但是显示在屏幕上,如下图:
蓝色的是手机屏幕边框,红色的是一个全屏的canvas
当canvas旋转30度之后,其实成了这个样子,但是你绘制的图形还是只能在canvas内,并且坐标是按照canvas旋转之前来的,也就是左上角坐标仍然是(0,0),右下角的坐标仍然是(width,height)。
也就是说,你按照(100,100,150,150)画出来的rect需要旋转30度之后,才是你看到的效果,这就是上面那个坐标看上去好像不对的原因。
忘记个重要的事情,这个canvas只是定义了画图的规则,范围,但是其实图是画在屏幕上的,所以最开始那个2个rect谁该旋转的问题就解决了。
那么save和restore的问题也就好解决了,save只是save了当前这个canvas的状态,和已经画出来的图形无关,restore就是取出最近一次save的canvas的状态,仍然不影响图形。
还有一个涉及到的问题就是,如下面旋转canvas之后的图,那么这个时候画在canvas之外的图形会怎么处理保存,试验了之后发现,由显示控件截取。
也就是说如果我画在一个bitmap上,那么这个bitmap的边界就是能显示的最大范围
分享到:
相关推荐
讲解使用canvas.save()和canvas.restore()的demo
android中canvas的save和restore用法 源码 测试代码
该代码是一个完整的Android工程,详细演示如了如何使用Android中的各种drawXXX方法,以及画笔Paint如何影响绘制的效果。 具体参见博文: http://blog.csdn.net/iispring/article/details/49770651
Android Canvas绘图演示代码
Android Canvas演示代码,
Android 自定义画布canvas 实现绘制和清空画布功能,内含源码、apk
android 画曲线图 画三角形(多边形),可以画成股票K线图,儿童成长曲线等,使用android的canvas
android 使用canvas把矩形图片变成圆角矩形显示 参考网址:http://blog.csdn.net/rhljiayou/article/details/7212620
主要介绍了 Android canvas drawBitmap方法详解及实例的相关资料,需要的朋友可以参考下
Android下使用Canvas画图,详细参见博客:http://www.cnblogs.com/plokmju/p/android_Canvas.html
Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
android利用Paint在Canvas上实现竖排写字
android-canvas-donut-chart.7z
Android 在Canvas指定区域绘制图片
学习Android自定义控件的必学前导知识——Canvas
Android通过Canvas手绘一个折线图详细查看https://blog.csdn.net/Iamzgx/article/details/79824969
重要的类自定义View组件要重写View组件的onDraw(Canvase)方法,接下来是在该 Canvas上绘制大量的几何图形,点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形,等各种形状!
android 中canvas的save和resotre用法 测试代码
安卓撕衣服,用Bitmap,Canvas,Paint实现的
博文《 Android画布canvas rotate,translate的理解》http://blog.csdn.net/peak1chen/article/details/50776507demo下载链接