HTML5 Canvas与localStorage简单应用

news/2025/2/25 19:09:06
Canvas 是HTML5的一大2d图形处理利器,localStorage是本地存储,它有一个很有意思的API,类似于观察者模型的事件storage事件,一者本地存储发生改变,它会响应注册了storage事件的所有窗口。 这样当我们在其中一个窗口的Canvas中画东西是,其它窗口可以监听并重绘,这就是下面的这个例子。

 

打开两个窗口,然后在其一个窗口画,另一个窗口则可以看到你画的东东 

 

 

 

     var canvas = document.getElementById("drawbroad"); 
            canvas.addEventListener("mousemove", onMouseMove,  false); 
            canvas.addEventListener("mousedown", onMouseDown,  false); 
            canvas.addEventListener("mouseup", onMouseUp,  false); 
              var btnSave=document.getElementById("btnSaveToImage");
            btnSave.addEventListener("click", function(evt){
// alert("d");
Canvas2Image.saveAsPNG(canvas); 
            }, false)
             var info = document.getElementById("pointInfo");
             var context = canvas.getContext("2d"); 
          // 当前坐标信息
             var linePoint=[];
             // 记录鼠标是否按下
             var isMouseDown=0; 
              // 添加
             window.addEventListener('storage',  function(evt) { 
console.log('The value for ' + evt.key + ' was changed from' + evt.oldValue + ' to ' + evt.newValue);
if(evt.key=="pointInfo")
{
// 开始画传过来的点信息
var strPointInfo=evt.newValue.split(";");
               // 保存上一次状态
              context.save();
               // 设置线条宽度
              context.lineWidth=4;
               // 线条颜色
              context.strokeStyle="#808080";
               // 准备画
              context.beginPath(); 
               // 异步方式
              /* var drawAsync = eval(Jscex.compile("async", function () {
             for(var i=0;i<strPointInfo.length;i++)
              {
var tempPoint=strPointInfo[i].split(",");
if(i==0)
{
//将起点移动到些位置
context.moveTo(tempPoint[0],tempPoint[1]);
}
//移到哪画到哪 
context.lineTo(tempPoint[0],tempPoint[1]); 
//边画边显示
context.stroke();
$await(Jscex.Async.sleep(1));
                  } 
}));
drawAsync().start();
*/
               // 同步方式
for( var i=0;i<strPointInfo.length;i++)
              {
var tempPoint=strPointInfo[i].split(",");
if(i==0)
{
// 将起点移动到些位置
context.moveTo(tempPoint[0],tempPoint[1]);
}
else{
// 移到哪画到哪 
context.lineTo(tempPoint[0],tempPoint[1]); 
// 边画边显示
context.stroke();
                   } 
                  }
                    // context.restore();
                   context.closePath();
}
             },  false);
             function onMouseMove(evt) {
if(isMouseDown==1)
{
// 记录鼠标移动的点
linePoint.push({x:evt.layerX,y:evt.layerY});
// 移到哪画到哪 
                   context.lineTo(evt.layerX,evt.layerY); 
                    // 边画边显示
                   context.stroke();
                    // context.restore();

             info.innerHTML="X:"+evt.layerX +" Y:"+evt.layerY;
            } 
             function onMouseDown(evt) { 
linePoint=[]; 
               // 标记鼠标已经按下
              isMouseDown=1;
               // 记录鼠标按下的位置
              linePoint.push({x:evt.layerX,y:evt.layerY}); 
               // 保存上一次状态
              context.save();
               // 设置线条宽度
              context.lineWidth=4;
               // 线条颜色
              context.strokeStyle="#808080";
               // 将起点移动到些位置
              context.moveTo(evt.layerX,evt.layerY); 
               // 准备画
              context.beginPath(); 
            } 
             function onMouseUp(evt) { 
// 标记鼠标已经弹起
               isMouseDown = 0; 
                // 记录鼠标最后的位置 
               linePoint.push({x:evt.layerX,y:evt.layerY});
                // 移到哪画到哪 
               context.lineTo(evt.layerX,evt.layerY); 
                // 边画边显示
               context.stroke(); 
                // context.restore();
                // 将本次的坐标信息传到后台
var strPointData=""
for( var i=0;i<linePoint.length;i++)
{
strPointData+=linePoint[i].x+","+linePoint[i].y+";";
}
strPointData=strPointData.substring(0,strPointData.length-1)
               localStorage.setItem('pointInfo',strPointData);
context.closePath();

            }  

作者:Louja
出处:http://loujady.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此声明,且在文章页面给出原文连接,否则保留追究法律责任的权利。 

 

转载于:https://www.cnblogs.com/loujady/archive/2011/12/06/2277832.html


http://www.niftyadmin.cn/n/2219412.html

相关文章

c与python哪个简单_Python与C的简单比较(Python3.0)

Python可以说是目前最火的语言之一了&#xff0c;人工智能的兴起让Python一夜之间变得家喻户晓&#xff0c;Python号称目前最最简单易学的语言&#xff0c;现在有不少高校开始将Python作为大一新生的入门语言。本萌新也刚开始接触Python&#xff0c;发现Python与其他语言确实有…

Java中自定义异常的使用

Java中的自定义异常的使用步骤&#xff1a; 1.定义异常&#xff0c;并继承Exception&#xff0c;分别构造无参函数和有参构造函数&#xff0c;并在构造函数中分别调用父类的无参构造函数和有参构造函数 <span style"font-size:18px;">package com.bluesky;pub…

服务器管理Linux经典命令

1.站点根目录下查找是否被放置webshell***根据语句判断是不是PHP***脚本 # find /storage/www/ -name "*.php" | xargs grep -in --color "eval(" # grep -i --include*.php -r system\s*\( /storage/www/ 2.统计访问日志中来自同ip出现的次数分析盗链、**…

Java中应用Collections工具类的Sort()方法对List进行排序

一、Sort排序方法的使用&#xff1a; 1.对Integer类型进行排序 (该类型已经实现Comparable接口) 2.对String类类型进行排序 (该类型已经实现Comparable接口) 3.对其他类型进行排序 (需要自己实现Comparable接口) 二、Comparable接口和Comparator接口的比较&am…

make的常见错误信息

本文对make执行时可能出现常见错误进行汇总、分析&#xff0c;并给出修正的可能方法。 make执行过程中所产生错误并不都是致命的&#xff1b;特别是在命令行之前存在“-”、或者make使用“-k”选项执行时。make执行过程的致命错误都带有前缀字符串“***”。 错误信息都有前缀&a…

Java中文件的拷贝

一、字节流的基本知识&#xff1a; 1.输入流&#xff1a;InputStream &#xff08;in &#xff09; 输出流&#xff1a;OutputStream &#xff08;out&#xff09; 2.输入流的基本方法&#xff1a; *int b in.read(); //读取一个字节 *…

replace into .. ON DUPLICATE KEY更新多行记录

如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE&#xff0c;并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值&#xff0c;则执行旧行UPDATE&#xff1b;如果不会导致唯一值列重复的问题&#xff0c;则插入新行。例如&#xff0c;如果列a被定义为UNIQUE&…

Java中的UDP编程

一、UDP编程特点&#xff1a; 1、无连接&#xff0c;不可靠&#xff0c;无序的&#xff1b; 2、UDP协议以数据报作为传输媒体&#xff1b; 进行数据传输时&#xff0c;首先需要将要传输的数据定义成数据报Datagram&#xff0c;在数据报中指明所要到达的Socket&#xff0c;即 …