查看效果请到 http://philippica.github.io/  点击paint

嗯,心血来潮想做个东西的一部分

html部分不用多说了,重点就是一个canvas

 <!DOCTYPE html>
<html>
<head>
<title>foo</title>
<meta charset = "utf-8">
<script type = "text/javascript" src="jquery.js"></script>
<style>
*{margin:0 ; padding : 0;}
html, body{background-color : black; height : 100%;width: 100%;}
</style>
</head>
<body>
<canvas id = "myCanvas" width = "1000" height = "600"></canvas>
<script type = "text/javascript" src= "pp.js"></script>
</body>
</html>

嘛把背景设成黑色只是我的恶趣味

关键就在Js部分

首先最关键的三个事件

1.鼠标按下(开始画线)

2.鼠标移动(如果鼠标处于按下状态画线)

3.鼠标松开(停止画线)

此外还有两个事件,即当鼠标移出canvas的时候,和进入canvas的时候,这是两个细节,下面再说

画线采用多条直线拼接的方式画曲线

首先确定一个bool变量ppMousePressed 表示鼠标此时是否按下,ppPointArray记录下每个点的位置,方便以后做进一步的包括撤销等命令

 var ppPoint = function(x, y)
{
this.x = x;
this.y = y;
} var ppPointArray = new Array();
var ppMousePressed;
9 var context = document.getElementById('myCanvas').getContext("2d");

当鼠标按下时除了要设置ppMousePressed,还要记录画的第一个点,注意松开鼠标这一事件应该是整个窗口的而不仅仅是canvas

$('#myCanvas').mousedown(function(e)
{
if(e.which == 1)// 如果是左键
{
ppMousePressed = true;
var mouseX = e.pageX - this.offsetLeft;
var mouseY = e.pageY - this.offsetTop;
ppPointArray.push(new ppPoint(mouseX, mouseY)); //记录路径的第一个点
}
}); $(window).mouseup(function(e){
ppMousePressed = false;
});

当鼠标移动的时候,如果鼠标按下,那么画线

 $('#myCanvas').mousemove(function(e)
{
if(ppMousePressed)
{
var mouseX = e.pageX - this.offsetLeft;
var mouseY = e.pageY - this.offsetTop;
ppDrawLine(mouseX, mouseY);
}
});

画线ppDrawLine函数只要向数组中上一个点连线即可,并向数组插入新的点

 function ppDrawLine(curX, curY)
{
context.beginPath();
var ppLastPoint = ppPointArray[ppPointArray.length - 1];
context.moveTo(ppLastPoint.x, ppLastPoint.y);
context.lineTo(curX, curY);
context.closePath();
context.stroke();
ppPointArray.push(new ppPoint(curX, curY));
}

到这里画板的功能大体能用了,但是发现当鼠标移出canvas后再回到canvas会向刚才离开的那个点连线,一个好的方法是当鼠标移入的时候新加一个点为鼠标移入的位置:

 $('#myCanvas').mouseenter(function(e){
var mouseX = e.pageX - this.offsetLeft;
var mouseY = e.pageY - this.offsetTop;
ppPointArray.push(new ppPoint(mouseX, mouseY));
});

另一个问题是当鼠标移出过快时线在移出canvas的地方会有不完整,这是由于mousemove反应过来时你已经移出canvas了,可行的方法是当移出的时候强制在移出位置和上一个点连线

 $('#myCanvas').mouseleave(function(e){
if(ppMousePressed)
{
var mouseX = e.pageX - this.offsetLeft;
var mouseY = e.pageY - this.offsetTop;
ppDrawLine(mouseX, mouseY);
}
});

这样就很完美了,为了让曲线更加光滑 可以设置 context.lineJoin = "round";

最新文章

  1. VS编译链接时错误(Error Link2005)的解决方法
  2. Python anaconda links to GOMP_4.0 and throws error
  3. c++ 左值右值 函数模板
  4. Linux系统常见的压缩与打包
  5. PLSQL_性能优化系列19_Oracle Explain Plan解析计划通过Profile绑定
  6. FZOJ--2221-- RunningMan 福建第六届省赛
  7. 【转】 IE6 IE7 IE8 css bug兼容性解决方法总结归纳
  8. 动态修改PE文件图标(使用UpdateResource API函数)
  9. iOS UIScrollview代理方法
  10. iOS开发之使程序在后台运行
  11. (转)log4j(一)——为什么要用log4j?
  12. KaliLinuxNetHunter教程实施刷机解锁Bootloader
  13. 0_Simple__simpleSeparateCompilation
  14. JQuery操作Select标签
  15. A*寻路算法(曼哈顿距离)
  16. java多线程总结(一)
  17. dll隐式链接延迟加载
  18. 浙南联合训练赛 B-Laptops
  19. SVN客户端与服务器端搭建
  20. (16)C#继承

热门文章

  1. dynamic routing between captual
  2. 一、MySQL 安装
  3. ZendFramework-2.4 源代码 - 关于MVC - Controller层
  4. 解决cmd目录下pip命令不存在的问题
  5. Python猫荐书系列之七:Python入门书籍有哪些?
  6. 闯越自动签到demo版补充说明
  7. Ubuntu samba 安装与配置 实现windows和虚拟机中的Ubuntu共享文件
  8. Sublime Text配置python以及快捷键总结
  9. 【转】Python操作MongoDB
  10. JDK各版本新特性浅谈