Android中canvas.save()和canvas.restore()的使用

自己定义控件时经常遇到重写View的Ondraw()方法,Ondraw()方法经常设计到save()和restore()这两个方法.这两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的。

详细作用例如以下:

1.save():用来保存Canvas的状态,save()方法之后的代码,能够调用Canvas的平移、放缩、旋转、裁剪等操作!

2.restore():用来恢复Canvas之前保存的状态,防止save()方法代码之后对Canvas运行的操作。继续对兴许的绘制会产生影响。通过该方法能够避免连带的影响!

以下简单举个样例。说明一下,先来看第一段代码:

private class DemoView extends View {
		private Paint mPaint;
		private Bitmap bitmap1;
		private Bitmap bitmap2;

		public DemoView(Context context) {
			super(context);
			mPaint = new Paint();
			bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.a);
			bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);
		}

		@Override
		protected void onDraw(Canvas canvas) {
			canvas.drawBitmap(bitmap1, 0, 0, mPaint);
			canvas.scale(5f, 5f);
			canvas.drawBitmap(bitmap2, 30, 30, mPaint);
			super.onDraw(canvas);
		}

	}

非常easy的演示样例,就是画了两个图片,而且在第一个画完后。把画布放大了5倍。效果如图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDM1ODE2OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

以下,我们把代码稍作修改,例如以下:

private class DemoView extends View {
		private Paint mPaint;
		private Bitmap bitmap1;
		private Bitmap bitmap2;

		public DemoView(Context context) {
			super(context);
			mPaint = new Paint();
			bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.a);
			bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);
		}

		@Override
		protected void onDraw(Canvas canvas) {
			canvas.drawBitmap(bitmap1, 0, 0, mPaint);
			canvas.save();//保存
			canvas.scale(5f, 5f);
			canvas.restore();//恢复
			canvas.drawBitmap(bitmap2, 30, 30, mPaint);
			super.onDraw(canvas);
		}

	}

效果例如以下:

这样是不是效果对照非常明显了。

简述一下两个的不同吧:

1.第一段代码中画了bmp1后就运行了缩放操作,而且没有保存状态!紧接着画了bmp2。那么bmp2也会一样受到缩放的影响。!

2.第二段代码中我们进行画布缩放的之前保存了画布状态,做了缩放操作之后又取出之前保存的状态,这样做是为了保证bmp2正常画出来不受到缩放的影响!

嗯,貌似是看懂了,不知道你懂了没~

时间: 2024-10-12 15:05:55

Android中canvas.save()和canvas.restore()的使用的相关文章

Android canvas.save()和canvas.restore()的理解

群里一哥们面试的时候被问到canvas.restore()的作用是什么,与之常常被一起问到的是canvas.save()的作用是什么.最近在上海开发航运项目,忙里偷闲总结一下两个方法的用法,以后也将在博客中记录面试中可能会被问到的一些其他问题. Canvas相当于一块画布,该类中常用的方法如下: drawRect(RectF rect, Paint paint) drawPath(Path path, Paint paint) drawBitmap(Bitmap bitmap, Rect src

canvas.save()和canvas.restore()作用

文章转自:oney139: 最终所有权归作者所有. 链接:http://blog.csdn.net/oney139/article/details/8143281. canvas.save()和canvas.restore():是两个相互匹配出现的,作用是用来存储画布的状态和取出保存的状态的.这里稍微解释一下. 当我们对画布进行旋转,缩放,平移等操作的时候其实是对特定的元素进行操作,比如图片,一个矩形等.但是当你用canvas的方法来进行这些操作的时候,其实是对整个画布进行了操作,那么之后在画布

Android中使用SurfaceView和Canvas来绘制动画

其实每个View中都有Canvas可以用来绘制动画,只需要在这个View中重载onDraw()方法就可以,但是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做"画布")就和HTML5中的canvas标签一样可以在一定区域内自由绘制图形.Canvas+SurfaceView制作的动画与View Animation和Property Animation这类动画比起来更加适合大量的集中播放的动画,比如游戏画面.相机的图像显示等. 因为SurfaceView通常会在

Android 中Canvas的save(),saveLayer()和restore()解析

1.save()方法 : 用来保存Canvas的状态,save()方法之后的代码,可以调用Canvas的平移.放缩.旋转.裁剪等操作! 2.restore()方法: 用来恢复Canvas之前保存的状态(可以想成是保存坐标轴的状态),防止save()方法代码之后对Canvas执行的操作,继续对后续的绘制会产生影响,通过该方法可以避免连带的影响 总结:就是在save之前绘制的状态会保存下来,在restore方法之后绘制的不会再因为状态而改变 示例说明: 例如:我们想在画布上绘制一个向右的三角箭头,当

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

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

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

Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22      阅读:1445      评论:0      收藏:0      [点我收藏+] save()  saveLayer()  restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 复写onDraw(Canvas canvas),其中Canvas就像是

Android中Canvas绘图基础详解(附源码下载)

Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API.Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形.Canvas绘图有三个基本要素:Canvas.绘图坐标系以及Paint.Canvas是画布,我们通过Canvas的各种drawXXX方法将图形绘制到Canvas上面,在drawXXX方法中我们需要传入要绘制的图形的坐标形状,还要传入一个画笔Paint.drawXXX方法以及传入其中的坐标决定了要绘制的图形的形状

Android中Canvas绘图基础详解

原文:http://blog.csdn.net/iispring/article/details/49770651 Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API.Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形.Canvas绘图有三个基本要素:Canvas.绘图坐标系以及Paint.Canvas是画布,我们通过Canvas的各种drawXXX方法将图形绘制到Canvas上面,在drawXXX方法中我们需要

Android中自定义视图View之---Canvas和Path对象

介绍Android中的Paint和Canvas的概念和使用方法 Android中的Paint和Canvas的概念是很简单的,就是我们用画笔在画布上进行绘制没什么难度的,我们只要拿到画笔Paint和画布Canvas对象就可以进行操作了.当然Canvas对象提供了很多绘制图形的方法,下面来看一下代码吧: package com.example.drawpathdemo; import android.annotation.SuppressLint; import android.content.Co