博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5 canvas save和restore方法讲解
阅读量:5739 次
发布时间:2019-06-18

本文共 1552 字,大约阅读时间需要 5 分钟。

hot3.png

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

  

  save()和restore()方法是绘制复杂图形必不可少的方法.它们分别是用来保存和恢复 canvas 状态的,都没有参数。

  Canvas 状态是以堆(stack)的方式保存的,每一次调用 save 方法,当前的状态就会被推入堆中保存起来。这种状态包括:当前应用的变形(即移动,旋转和缩放,见下):

  strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, miterLimit, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor, globalCompositeOperation 的值

  你可以调用任意多次 save 方法。每一次调用 restore 方法,上一个保存的状态就从堆中弹出,所有设定都恢复。

  举个save 和 restore 的应用例子吧。

  我们尝试用这个连续矩形的例子来描述 canvas 的状态堆是如何工作的。

  第一步是用默认设置画一个大四方形,然后保存一下状态。改变填充颜色画第二个小一点的白色四方形,然后再保存一下状态。再次改变填充颜色绘制更小一点的蓝色四方形。然后我们调用了restore方法将设置回到前一个save状态下的fillStyle="white",即在不设定颜色值的情况下再绘制最小的矩形时其添充色为白色。

  一旦我们调用 restore,状态堆中最后的状态会弹出,并恢复所有设置。如果不是之前用 save 保存了状态,那么我们就需要手动改变设置来回到前一个状态,这个对于两三个属性的时候还是适用的,一旦多了,我们的代码将会猛涨。简而言之restore方法就可以理解成将其对应的当前save状态下的设置全部恢复为前一个状态

  代码:

<script type="text/javascript">

window.οnlοad=function(){
 var ctx=document.getElementByIdx_x("canvas").getContext("2d");
 ctx.fillRect(10,10,150,150);
 ctx.save();
 ctx.fillStyle="white";
 ctx.fillRect(30,30,110,110);
 ctx.save();
 ctx.fillStyle="blue";
 ctx.fillRect(50,50,70,70);
 ctx.restore();//回到上一个状态,即 ctx.fillStyle="white";
 ctx.save();
 ctx.fillRect(70,70,30,30);//所以此处没有设定fillStyle的时候颜色为white,注意哦!如果在白色矩形后面也restore一下刚此处的fillStyle就为黑色了
 ctx.restore();
}
</script>

  本文来自瓶中精灵的博客,原文地址:http://blog.sina.com.cn/s/blog_a3468cf601013dmi.html

转载于:https://my.oschina.net/u/615191/blog/265625

你可能感兴趣的文章
UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库
查看>>
php连接符
查看>>
Linux内核同步:自旋锁
查看>>
chrom中 background 调用pop.js
查看>>
【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享
查看>>
HttpURLConnection与HttpClient浅析
查看>>
Go 语言和 Scala 语言对比
查看>>
Mecanim动画编辑器 - 加入动画层实现并行动作
查看>>
JAVA设计模式之工厂模式
查看>>
带有飞线的地图
查看>>
Python 的 pandas 实践
查看>>
Java:现有线程T1/T2/T3,如何确保T1执行完成之后执行T2,T3在T2执行完成之后执行。...
查看>>
使用keytool生成公钥、私钥、证书并且读取出来,使用私钥签名jar并验证(转)...
查看>>
centos安装python的虚拟环境和虚拟管理环境
查看>>
SQL Server系统视图sys.master_files不能正确显示数据库脱机状态
查看>>
Java-JUC(三):原子性变量与CAS算法
查看>>
jQueryEasyUI学习笔记
查看>>
基于 HTML5 WebGL 的低碳工业园区监控系统
查看>>
layui实现点击按钮添加行(方法渲染创建的table)
查看>>
常用单词5
查看>>