http://www.cnblogs.com/xirihanlin/archive/2009/07/24/1530246.html
在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法。
onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。
在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?
❑ save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
❑ restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。
例如:我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是:
int px = getMeasuredWidth();
int py = getMeasuredWidth();
// Draw background
canvas.drawRect(0, 0, px, py, backgroundPaint);
canvas.save();
canvas.rotate(90, px/2, py/2);
// Draw up arrow
canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
canvas.restore();
// Draw circle
canvas.drawCircle(px - 10, py - 10, 10, linePaint);
效果如图1所示:
图1
如果我们不调用save和restore会是什么样子呢?如图2所示:
图2
从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能造成绘制的图形不同。
所以,save和restore之间,往往夹杂的是对Canvas的特殊操作。
相关推荐
android中canvas的save和restore用法 源码 测试代码
讲解使用canvas.save()和canvas.restore()的demo
Android Canvas演示代码,
android 中canvas的save和resotre用法 测试代码
一:canvas中的save和restore 一直以来没有特别明白canvas中的save()和restore()函数,这次终于通过微信小程序中使用此函数的时候弄明白了,以下代码可以运行在微信小程序中~~ 看效果: (此图片来源于网络,如有...
this.ctx.save(); this.ctx.translate(this.w / 2, this.h / 2); this.ctx.rotate(this.rot); ref = this.objects; for (j = 0, len = ref.length; j ; j ) { obj = ref[j]; obj.draw(); } ...
ctx.save(); ctx.strokeStyle = this.color; ctx.beginPath(); ctx.moveTo(this.points[this.points.length - 1].x, this.points[this.points.length - 1].y); for (var i = len; i >= 1; i--) { ...
canvas.saveLayer(-baseR, -baseR, baseR , baseR, null, Canvas.ALL_SAVE_FLAG) //绘制遮罩层 canvas.drawBitmap(dstB, -baseR / 2F, -baseR / 2F , paint) //设置遮罩模式为SRC_IN显示原...
主要介绍了Android canvas画图操作之切割画布实现方法,通过clipRect方法实现canvas画布的切割操作,需要的朋友可以参考下
ctx.save(); ctx.lineWidth = 0.8; ctx.strokeStyle = strokeColor; ctx.fillStyle = fillColor; ctx.beginPath(); ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, true); ctx....
本篇文章主要介绍了Android Canvas方法总结最全面详解API,分享给大家,具体如下: 常用方法 drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面... save(),restore(),saveLayer(),resto
将图片进行编辑(放缩,涂鸦等),最后保存成指定格式、大小的图片。... canvas.save(Canvas.ALL_SAVE_FLAG); canvas.restore(); File file = new File(“/sdcard/akai/”); if(!file.exists()) file
以及html5 Canvas的路径绘图,beginPath,closePath,rect,arc等,还有就是html5 Canvas路径绘图重要的绘图状态的保存和恢复机制,save,restore。 多的也不说了,直接上代码,有不解的欢迎提问,以及对我的建议...
> 之前看到qq 的图片发送效果很酷炫,很吸引人,不过现在...先保存画布,save()到最后要canvas.restore().因为显示图片,可以有两种选择,第一种:自己绘制图片,通过drawable得方式。第二种:继承ImageView 同时还可以
主要介绍了使用HTML5 Canvas API中的clip()方法裁剪区域图像的实例教程,其中需要特别注意save()和restore()方法的搭配使用,需要的朋友可以参考下
例如可以用它来画图、合成图象、或做简单的(和不那么简单的)动画。 var canvas = document.getElementById("canvas"), context = canvas.getContext("2d");context.fillStyle="rgb(0,0,200)";context.fillRect(10, ...
需要运用到的关于canvas的一些代码 save()方法把当前状态的一份拷贝压入到一个保存图像状态的栈中。这就允许您临时地改变图像状态,然后,通过调用 restore() 来恢复以前的值。 可是要注意,当前路径和当前位置...
canvas.save(); canvas.rotate(offsetDegree, mWidth / 2, mHeight / 2); // 给画笔设置随机颜色 mTextPaint.setARGB(255, mRandom.nextInt(200) + 20, mRandom.nextInt(200) + 20, mRandom.nextInt(200) + 20);...
也可以在使用clip()方法前通过使用save()方法对当前画布区域进行保存,并在以后的任意时间通过restore()方法对其进行恢复 接下来使用clip()方法实现一个探照灯效果 <button id="btn">变换</button> <...
restore() 返回之前保存过的路径状态和属性 createEvent() getContext()返回一个对象,指出访问绘图功能必要的API toDataUPL() 返回canvas图像的URL 线条样式的属性和方法 属性: lineCap设置或返回线条的...