应用到画布上面的效果是可以累积的,因而就可以利用几个简单的函数来“组合”出效果来。例如,在向屏幕上绘制之前,可能会有一艘飞船需要旋转、变换 和缩放。因为所有效果都对画布起作用,所以这些效果会应用到将被绘制在屏幕上的所有对象,而不仅仅是某一幅图像或某一个形状(比如一艘飞船)。

其中,save和restore函数为应用这些累积的效果提供了一种简单的机制,可以将应用了这些效果的图像或图形绘制到画布上,然后“撤销”这些 改变。后台的操作是什么呢?save函数把当前的绘制状态推进栈里,而restore函数则把最后一个状态弹出栈。还拿前面提到的飞船为例,需要执行下列 操作:

  • 调用save函数(保存当前的绘制状态)
  • 旋转、变换和缩放上下文
  • 绘制飞船
  • 调用restore函数,移除自上一次调用save方法以来所添加的任何效果,也就是撤销之前的变化

例子:

function draw()
{
    currentTime+=secondsBetweenFrames;
    sineWave=(Math.sin(currentTime)+1)/2;
    context.clearRect(0,0,canvas.width,canvas.height);//context的clearRect方法
    context.save();//context的save()方法
    context2D.translate(halfCanvasWidth - halfImageDemension, halfCanvasHeight - halfImageDemension);//context的translate()方法
    currentFunction();
    context.drawImage(image,0,0);//context的drawImage()方法
    context.restore();//context的restore()方法
}

在这里,我们就是要组合起来使用这两个方法。首先,在把任何效果应用到画布之前,先保存绘制状态。

context2D.save();

保存了绘制状态之后,就该应用目标效果了。为此,首先调用translate函数,从而将随后要绘制的图像在画布上居中。

context2D.translate(HALFCANVASWIDTH - HALFIMAGEDIMENSION, HALFCANVASHEIGHT - HALFIMAGEDIMENSION);

接下来,调用由变量currentFunction引用的函数。正是这些被引用的函数,是让图像发生alpha(透明度)变化以及缩放、旋转和切变的关键。这些函数我们稍后再介绍。

currentFunction();

为图像应用完效果之后,就可以把它绘制到画布上面了。所以,接下来就是调用drawImage来绘图。

context2D.drawImage(image, 0, 0);

最后,再调用restore函数,把自调用save函数以来应用的所有效果从画布上移除。

context2D.restore();

canvas 的save()和restore()方法相关推荐

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

    save()和restore()方法是绘制复杂图形必不可少的方法.它们分别是用来保存和恢复 canvas 状态的,都没有参数. Canvas 状态是以堆(stack)的方式保存的,每一次调用 save ...

  2. Canvas的save和restore方法

    2019独角兽企业重金招聘Python工程师标准>>> Canvas里的两个重要方法,一直很疑惑. save和restore方法是成对出现的,但是restore必然对应一个save方 ...

  3. Canvas的save和restore

    在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会 ...

  4. canvas中save和restore的理解和使用

    canvas中save和restore的理解和使用 理解save和restore不一定总是成对出现的 太阳系 理解save和restore不一定总是成对出现的 每个 canvas 的 context ...

  5. Android画布的保存,Android canvas用法介绍之save()和restore()

    一. 首先讲一下canvas的save 和 restore功能. 这是canvas很有魅力的一个部分. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方 ...

  6. canvas像素操作、save与restore、合成与变形

    一.canvas像素操作 (1)获取图像像素 (2)写入像素数据 (3)创建像素数据 (4)小案例,将canvasA画布的图像复制到canvasB中 二.canvas的save与restore 三.c ...

  7. canvas理解:一看就懂的save和restore

    一看就懂的save和restore 对于save()和restore()方法,我一开始有一个错误的理解,以为每一步都save()之后restore()就等同于command + z(或者ctrl + ...

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

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

  9. php画钟,canvas如何绘制钟表的方法_html5教程技巧

    这篇文章主要介绍了HTML5中的canvas如何绘制钟表的方法的相关资料,小编觉得HTML真的是越来越强大的,现在分享给大家,也给大家做个参考.对HTML的小伙伴们可以一起跟随小编过来看看吧 本文介绍 ...

最新文章

  1. 你必须要知道的架构知识~目录
  2. 独家 | 秘籍:10个Python字符串处理技巧(附代码)
  3. C 语言中的 feof()函数
  4. 如何识别AWARD的BIOS-ID
  5. Java数据结构和算法:位运算
  6. 复原 IP 地址Python解法
  7. 鼠标点击测试_鼠标键盘如何检测故障,这边教您简单的测试
  8. 加载文件流_jvm类加载的过程
  9. 易助erp系统服务器安装,易助ERP系统操作培训教程
  10. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
  11. pytorch: 网络层参数初始化
  12. MySQL 数据库事物隔离级别的设置
  13. Android基础类之BaseAdapter
  14. vb treeview icon 可以使用位图吗_table标签经典案例,综合使用行合并与列合并实现html网页表格【2020网页综合笔记03】...
  15. MongoDB 索引操作详解
  16. 精益思想,从哪里开始?
  17. Web 插件 之 ECharts 实现中国地图数据的简单展示实现
  18. linux进入运行exe命令,在Deepin V20系统中打开运行exe文件的两种方法
  19. 纯净版VS2015安装教程(适合初次安装或者重装系统后)
  20. c++ 栈 stack 用法

热门文章

  1. 次世代游戏建模师一个月的工资有多少?
  2. java之program arguments与VM arguments
  3. DevOps工具链及基于k8s的DevOps环境搭建
  4. 『往事』之---我的童年少年时代
  5. BZOJ1707:[Usaco2007 Nov]tanning分配防晒霜
  6. 计网复习day01 2020.8.18
  7. 如何通过MES实现机床联网?
  8. jvm基础学习总结笔记
  9. 各种邮箱收发服务器地址及端口
  10. 零技巧的电饭锅懒人菜