热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTML5Canvassave如何保存恢复状态?-

本篇文章给大家带来的内容是关于HTML5Canvassave如何保存恢复状态,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
本篇文章给大家带来的内容是关于HTML5Canvas save如何保存恢复状态,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

在绘画的时候,经常会有这种情况,本来正在用绿色笔画,突然需要用红色笔画几笔,但画完了之后又要换成绿色笔。如果是在现实中作画,可以把笔蘸上不同的墨水,画了之后又蘸上之前的墨水,或者准备几只笔,要用哪只就选哪只。

在Canvas中也可以这样,不过Canvas中的画笔永远只有一只。所以,如果要更换画笔的颜色,就需要保存和恢复状态。状态其实就是画布当前属性的一个快照,包括:

图形的属性值,如strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor等。

当前的裁切路径。

当前应用的变换(即平移、旋转和缩放)。

Canvas中,使用save()方法来保存状态,使用restore()方法来恢复状态。Canvas状态是以栈的方式来保存:每次调用save()方法,就会把当前状态压入栈顶保存;每次调用restore()方法,就会把栈顶的状态取出来,并把画布恢复到这个状态,用这个状态绘图。

context.fillStyle = "red";
context.fillRect(10, 10, 180, 180);
context.fill();
context.save();                 // ① 栈: "red"
context.fillStyle = "green";
context.fillRect(30, 30,140,140);
context.save();                 // ② 栈: "red","green"
context.fillStyle = "blue";
context.fillRect(50, 50, 100,100);
context.restore();               // 恢复到 ② 的状态, 栈: "red","green"
context.beginPath();
context.fillRect(70, 70, 60, 60);   // 用栈顶的状态绘图,填充"green"
context.restore();               // 恢复到 ① 的状态, 栈: "red"
context.fillRect(90, 90, 20, 20);   // 用栈顶的状态绘图,填充" red "
context.fill();

上述代码中,首先绘制第一个红色的矩形。接着调用第一个save()方法,把第一个红色矩形的状态压栈,此时栈中只有一个元素"red",记为 ①。然后把状态设置为"green",绘制第二个矩形,此时绘制出的是绿色矩形。接着调用第二个save()方法,把第二个绿色矩形的状态压栈,此时栈中有两个元素"red","green",栈顶元素为"green",记为 ②。接着绘制第三个蓝色矩形,此处没有调用save()方法,栈的状态不变。接着调用restore()方法,恢复到 ② 的状态,绘制第四个矩形,此时栈顶元素为"green",故绘制出绿色矩形。接着再调用restore()方法,恢复到 ① 的状态,绘制第五个矩形,此时栈顶元素为"red",故绘制出红色矩形。

从本例可以看到,通过save-restore组合把代码包裹起来,实质上是把save()方法和restore()方法之间的样式包裹起来,这样一来,它们就不影响后面绘制的图形。

save()方法和restore()方法都可以被调用任意多次,并且可以嵌套。记住,save()方法和restore()方法总是成对出现,每次调用restore()方法,都是恢复到最近一次调用save()方法时栈的状态,并用该栈顶所保存的状态进行绘制。

以上就是对HTML5Canvas save如何保存恢复状态的全部介绍,如果您想了解更多有关Html5视频教程,请关注PHP中文网。

以上就是HTML5Canvas save如何保存恢复状态?的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文介绍了如何利用jQuery实现对网页上多个div元素的显示与隐藏控制,包括基本的toggle方法及更复杂的显示隐藏逻辑。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • CSS Border 属性:solid 边框的使用详解
    本文详细介绍了如何在CSS中使用solid边框属性,包括其基本语法、应用场景及高级技巧,适合初学者和进阶用户参考。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 生活中的每个人都有可能陷入停滞不前的困境,适时地改变生活方式,如通过骑行等运动,不仅能够改善身体健康,还能在心理上带来新的启示与成长。 ... [详细]
  • 本课程将于3月26日至3月29日通过在线直播形式进行,涵盖有限元法的基本概念及其在生物力学中的应用,包括使用Mimics和ANSYS软件进行建模和分析的具体操作。 ... [详细]
  • 本文探讨了Windows 10 64位系统的实际使用体验,并与Windows 7进行了详细对比,旨在帮助用户了解两者之间的主要差异及选择合适的操作系统。 ... [详细]
  • HBase 数据复制与灾备同步策略
    本文探讨了HBase在企业级应用中的数据复制与灾备同步解决方案,包括存量数据迁移及增量数据实时同步的方法。 ... [详细]
  • 如何更改Win10本地管理员账户名称
    本文详细介绍了更改Windows 10操作系统中本地管理员账户名称的方法,包括通过计算机管理界面进行操作的具体步骤。 ... [详细]
  • TCP协议中的可靠传输机制分析
    本文深入探讨了TCP协议如何通过滑动窗口和超时重传来确保数据传输的可靠性,同时介绍了流量控制和拥塞控制的基本原理及其在实际网络通信中的应用。 ... [详细]
  • 本文介绍了.hbs文件作为Ember.js项目中的视图层,类似于HTML文件的功能,并详细讲解了如何在Ember.js应用中集成Bootstrap框架及其相关组件的方法。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
author-avatar
手机用户2502906225
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有