canvas 的save()和restore()方法
2016-04-04 11:56
274 查看
应用到画布上面的效果是可以累积的,因而就可以利用几个简单的函数来“组合”出效果来。例如,在向屏幕上绘制之前,可能会有一艘飞船需要旋转、变换 和缩放。因为所有效果都对画布起作用,所以这些效果会应用到将被绘制在屏幕上的所有对象,而不仅仅是某一幅图像或某一个形状(比如一艘飞船)。
其中,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()方法
}
在这里,我们就是要组合起来使用这两个方法。首先,在把任何效果应用到画布之前,先保存绘制状态。
保存了绘制状态之后,就该应用目标效果了。为此,首先调用translate函数,从而将随后要绘制的图像在画布上居中。
接下来,调用由变量currentFunction引用的函数。正是这些被引用的函数,是让图像发生alpha(透明度)变化以及缩放、旋转和切变的关键。这些函数我们稍后再介绍。
为图像应用完效果之后,就可以把它绘制到画布上面了。所以,接下来就是调用drawImage来绘图。
最后,再调用restore函数,把自调用save函数以来应用的所有效果从画布上移除。
其中,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();
相关文章推荐
- SSD硬盘 全盘安全擦除
- java输出菱形(正金字塔+倒金字塔)
- Tensorflow 官方版教程中文版
- GDOI'2016市选day1 —— 3. 最大值求和 (summax)
- codeforces 143 C.To Add or Not to Add (YY 二分 处理一下前缀和)
- LeetCode #2 Add Two Numbers Cpp Solution
- SNAT,是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址
- dp学习之BadNeighbors解法
- AQS(5):ReentrantLock
- hdu 1241 Oil Deposits
- 蛇形矩阵(百度2016实习招聘)
- JavaWeb - Http协议
- 实现单点登录的思路
- Mysql db
- java动态代理技术
- java.util.concurrent包 以及 线程池的使用。
- RMI、RPC、SOAP通信技术介绍及比对
- 2014 打印图形
- 冒泡选择插入快速,四种最基础排序算法实现
- 做个毕设也不容易之购物车模块遇到java.lang.IllegalArgumentException