canvas中的restore()与save()

关于栈中的元素以及正在使用的元素

可以这样理解:

  栈是一个仓库, 只是储存着我们需要的格式, 除了仓库中的东西, 我们手中还有一个正在使用的格式, 每一次往栈中存储的时候, 只是把我们手中的东西复制了一份放到了仓库中, 只有调用restore()函数的时候 我们才会从栈中取出一个格式替代我们手中正在使用的格式.

 

突然发现这种理解方式好像有点问题, 源于做签名小实验时, 本以为签名是粉色的, 但是结果总是黑色的

//名小实
var mycanvas = document.querySelector("#mycanvas");
if(mycanvas){
var context = mycanvas.getContext("2d");
}

mycanvas.onmousedown = function (ev) {
ev= ev || window.event;


if(mycanvas.setCapture){
mycanvas.setCapture();
}

context.beginPath();
context.save();

context.strokeStyle = "deeppink";
context.lineWidth = 5;

context.moveTo(ev.clientX - mycanvas.offsetLeft,
ev.clientY - mycanvas.offsetTop);

document.onmousemove = function(ev){
ev = ev || event;

context.lineTo(ev.clientX - mycanvas.offsetLeft,
ev.clientY - mycanvas.offsetTop);
context.stroke();



}


context.restore();
document.onmouseup=function(){
document.onmousemove=document.onmouseup=null;
if(document.releaseCapture){
document.releaseCapture();
}
}

return false;




但是又同时与另外一个案例冲突

var mycanvas = document.querySelector("#mycanvas");
if(mycanvas){
context = mycanvas.getContext("2d");
}

context.save();
context.fillStyle = "pink";
context.save();

context.fillRect(100,100,100,100);
context.restore();
context.fillRect(200,200,100,100);
context.restore();
context.fillRect(300,300,100,100);


有点不知道, 当前使用的格式是不是栈最顶层的格式.........



最初理解没有错, 可能是代码中的问题, 但是还是不知道原因, 可能是逻辑错误
posted @   0龙行者0  阅读(225)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示