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

[java] view plain copy

  1. <span style="font-size:18px;"> </span>

[java] view plain copy

  1. <span style="font-size:18px;"></span>

绘图之前,首先需要调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上!Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要常用方法:

setAntiAlias: 设置画笔的锯齿效果。

setColor: 设置画笔颜色

setARGB:  设置画笔的a,r,p,g值。

setAlpha:  设置Alpha值

setTextSize: 设置字体尺寸。

setStyle:  设置画笔风格,空心或者实心。

setStrokeWidth: 设置空心的边框宽度。

getColor:  得到画笔的颜色

getAlpha:  得到画笔的Alpha值。

自定义控件时常常遇到重写View的Ondraw()方法,Ondraw()方法常常设计到save()和restore()这两个方法

,现结合demo简单分析一下这两个方法的作用:

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

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

通过一个例子说明一下:

例如:我们想在画布上绘制一个向右的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用),最后,我们在右下角绘一个20像素的圆!

代码:

[java] view plain copy

  1. <span style="font-size:18px;">package com.test.ui;
  2. import android.R.color;
  3. import android.content.Context;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Paint;
  7. import android.view.View;
  8. public class GameView extends View  {
  9. public final static String TAG = "Example_05_03_GameView";
  10. // 声明Paint对象
  11. private Paint mPaint = null;
  12. public GameView(Context context) {
  13. super(context);
  14. mPaint = new Paint();
  15. }
  16. @Override
  17. protected void onDraw(Canvas canvas) {
  18. super.onDraw(canvas);
  19. Paint background=new Paint();
  20. Paint line=new Paint();
  21. background.setColor(color.darker_gray);
  22. line.setColor(Color.RED);
  23. int px = getMeasuredWidth();
  24. int py = getMeasuredWidth();
  25. // Draw background
  26. canvas.drawRect(0, 0, px, py, background);
  27. canvas.save();
  28. canvas.rotate(90, px/2, py/2);
  29. //画一个向上的箭头
  30. canvas.drawLine(px / 2, 0, 0, py / 2, line); //左边的斜杠
  31. canvas.drawLine(px / 2, 0, px, py / 2, line);//右边的斜杠
  32. canvas.drawLine(px / 2, 0, px / 2, py, line);//垂直的竖杠
  33. canvas.restore();
  34. // Draw circle
  35. canvas.drawCircle(px - 10, py - 10, 10, line);
  36. }
  37. }
  38. </span>

MainActivity.Java:

[java] view plain copy

  1. <span style="font-size:18px;">package com.test.ui;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class MainActivity extends Activity {
  5. private GameView mGameView;
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. mGameView = new GameView(this);
  11. setContentView(mGameView);
  12. }
  13. }
  14. </span>

运行结果:

如果将 canvas.save()和canvas.restore()注释掉,那么圆点将会随着之前的90旋转跑到了左边,没有达到你预期想要显示在右下角的效果:

以上我们很明显看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能绘制不同的图形,save和restore之间,往往是对Canvas的特殊操作!

时间: 2024-08-14 21:48:31

android_浅析canvas的save()和restore()方法的相关文章

HTML5中canvas的save和restore方法

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

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

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

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

Canvas的save和restore

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

canvas 中save和restore的用法

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

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

[ 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