Canvas的save和restore简单程序说明

关于save和restore网上不少说明,在这里简单的用程序证实了一下。

图1

上图为绘制的最终图画,绘制这种view有多中方式。

a) 简单的方式:不对canvas进行任何平移或者旋转的操作,对canvas直接绘制。代码如下

@Override
		protected void onDraw(Canvas canvas) {
			int width = 900;
			int height = 900;

			Paint paint = new Paint();
			//上半部分红色举行
			paint.setColor(Color.RED);
			canvas.drawRect(0, 0, width, height / 2, paint);
			//下半部分绿色部分
			paint.setColor(Color.GREEN);
			canvas.drawRect(0, height / 2, width, height, paint);

            //右下角画个黑色的圆
			paint.setColor(Color.BLACK);
			canvas.drawCircle(width - 50, height - 50, 50, paint);
		}

b)  第二种方式

1.先绘制红色和绿色矩形

2.画布canvas旋转90度

3.绘制黑色的圆(注意此种方式没有调用save和restore方法),运行的效果图肯定不是图1的效果。如下

	protected void onDraw(Canvas canvas) {
			int width = 900;
			int height = 900;

			Paint paint = new Paint();
			//上半部分红色举行
			paint.setColor(Color.RED);
			canvas.drawRect(0, 0, width, height / 2, paint);
			//下半部分绿色部分
			paint.setColor(Color.GREEN);
			canvas.drawRect(0, height / 2, width, height, paint);

			//以canvas为圆心进行旋转,旋转90度
			canvas.rotate(90,width/2,height/2);
            //右下角画个黑色的圆
			paint.setColor(Color.BLACK);
			canvas.drawCircle(width - 50, height - 50, 50, paint);
		}

图2

我的理解:

其实注意旋转(包括平移的情况下)不是画布,而是(0,0)坐标轴的改变,在旋转之前(0,0)坐标轴左上角,而旋转90度之后就是右上角为(0,0)点,所以以右上角为(0,0)点做参照的画,canvas.drawCircle(width - 50, height - 50, 50, paint);

计算出的位置就是左下角了。

这就说明如果想让黑色的圆绘制在右下角,那么就得以左上角为(0,0)参照点来进行计算绘制。当然    canvas.rotate(-90,width/2,height/2);在原来的基础在旋转-90度就可以了实现图1的效果了,但是还没有说明save的作用。

下面说明save和restore用在这里的步骤

1)在画布旋转之前调用save();(0,0)为左上角

2)然后旋转90度 (0,0)坐标为右上角

3)restore()恢复到未旋转之前的状态.也就是(0,0)坐标恢复为左上角

4)绘制圆

此时就会绘制如图1的效果,如果不调用restore的回复save之前的状态,那么就会在旋转之后的canvas上(也就是以右上角为0,0左边来进行计算绘制。也就是图2的效果了

@Override
		protected void onDraw(Canvas canvas) {
			int width = 900;
			int height = 900;

			Paint paint = new Paint();
			//上半部分红色举行
			paint.setColor(Color.RED);
			canvas.drawRect(0, 0, width, height / 2, paint);
			//下半部分绿色部分
			paint.setColor(Color.GREEN);
			canvas.drawRect(0, height / 2, width, height, paint);

			canvas.save();//保存旋转之前的状态
			//以canvas为圆心进行旋转,旋转90度
			canvas.rotate(90,width/2,height/2);

			//回复旋转之前的画布状态
			canvas.restore();
			//右下角画个黑色的圆
			paint.setColor(Color.BLACK);
			canvas.drawCircle(width - 50, height - 50, 50, paint);
		}

总结:

时间: 2024-11-15 04:35:48

Canvas的save和restore简单程序说明的相关文章

android_浅析canvas的save()和restore()方法

[java] view plain copy <span style="font-size:18px;"> </span> [java] view plain copy <span style="font-size:18px;"></span> 绘图之前,首先需要调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上!Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进

Canvas的save和restore

在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? ? save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. ? restore:用来恢复Canvas之前保存的状态.防止save后对Canvas执行的操作对后续的绘制有影响. sa

HTML5中canvas的save和restore方法

canvas的save和restore方法: save() 方法把当前绘画状态的一份拷贝压入到一个保存图像状态的栈中.这里的绘画状态指坐标原点.变形时的变化矩阵(该矩阵是调用 rotate().scale() 和 translate() 的结果).以及图形上下文对象的当前属性值等内容. 1.图像上下文CanvasRenderingContext2D的属性和方法: 属性                              描述canvas                          取

canvas 中save和restore的用法

在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? ? save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. ? restore:用来恢复Canvas之前保存的状态.防止save后对Canvas执行的操作对后续的绘制有影响. sa

理解Canvas的save()和restore()方法

save()和restore()方法是绘制复杂图形必不可少的方法.它们分别是用来保存和恢复 canvas 状态的,都没有参数. Canvas 状态是以堆(stack)的方式保存的,每一次调用 save 方法,当前的状态就会被推入堆中保存起来.这种状态包括:当前应用的变形(即移动,旋转和缩放,见下):strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, miterLimit, shadowOffsetX,shadowO

[ html canvas save restore ] canvas绘图 save restore 属性理论讲解

Canvas API详解(Part 1) 分类 Android 基础入门教程 本节引言: 前面我们花了13小节详细地讲解了Android中Paint类大部分常用的API,本节开始我们来讲解 Canvas(画板)的一些常用API,我们在 8.3.1 三个绘图工具类详解 中已经列出了我们可供调用的一些方法,我们分下类: drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层. clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图

[ html canvas save restore ] canvas绘图 save restore 属性实例演示

解析: 我们可以在做平移变换之前将当前canvas的状态进行保存,其实Canvas为 我们提供了图层(Layer)的支持,而这些Layer(图层)是按"栈结构"来进行管理的 当我们调用save()方法,会保存当前Canvas的状态然后作为一个Layer(图层),添加到Canvas栈中, 另外,这个Layer(图层)不是一个具体的类,就是一个概念性的东西而已! 而当我们调用restore()方法的时候,会恢复之前Canvas的状态,而此时Canvas的图层栈 会弹出栈顶的那个Layer,

Android Canvas的save(),saveLayer()和restore()浅谈

save()  saveLayer()  restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 复写onDraw(Canvas canvas),其中Canvas就像是一块画布,你自定义控件的样式就是在它上面完成的. Canvas ,Paint等基本概念就不赘述了. 2.下面就直接用demo来解释标题列出的方法先介绍save()和 必须了解的相关知识:http://www.cnblogs.com

HTML5 canvas save和restore方法讲解

源:http://www.silverlightchina.net/html/HTML_5/study/2012/0326/14828.html save()和restore()方法是绘制复杂图形必不可少的方法.它们分别是用来 保存和恢复 canvas 状态的,都没有参数. Canvas 状态是以堆(stack)的方式保存的,每一次调用 save 方法,当前的状态就会被推入堆中保存起来.这种状态包括:当前应用的变形(即移动,旋转和缩放,见下): strokeStyle, fillStyle, g