HTML5 Canvas的一个有趣实例
来源:互联网 发布:漫画制作软件 编辑:程序博客网 时间:2024/05/21 14:52
例子来源于《HTML5 Canvas核心技术-图形、动画与游戏开发》第2章的程序2-16.这个程序里为canvas对象注册onmousemove事件处理函数时,先使用context.putImageData()函数载入鼠标按下之前的图像数据,然后再绘制线条。
我做了这样的改动:每当鼠标移动时,实时绘制鼠标指针的轨迹点到按下鼠标的点之间的每条线段。这样会变得比较有趣:可以画出放射状的图案,哈哈。如下图所示。
代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <meta charset="UTF-8"> <title>Canvas画图</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> <script type="text/javascript"> $(function(){ drawGrid(context, 'lightgray', 10, 10); context.strokeStyle = 'black'; }); </script> <style type="text/css"> #canvas{ margin: 0 auto; border: 1px solid #cccccc; box-shadow: #666666 0 0 15px; } #controls{ font-size: 16px; font-weight: bold; margin: 10px; } </style> </head> <body> <div id="controls"> 画笔颜色: <select id="strokeStyleSelect"> <option value="red">red</option> <option value="green">green</option> <option value="blue">blue</option> <option value="orange">orange</option> </select> 坐标线: <input type="checkbox" id="guidewireCheckbox" checked/> <input type="button" id="eraseAllButton" value="清空全部"> </div> <canvas id="canvas" width="1000px" height="700px"></canvas> <p id="expireTime"></p> <p id="callee_demo"></p></html><script type="text/javascript">var canvas = document.getElementById('canvas');var context = canvas.getContext('2d');function drawGrid(context, color, stepx,stepy){ context.strokeStyle=color; context.lineWidth = 0.5; for(var i= stepx +0.5;i<context.canvas.width;i+=stepx){ context.beginPath(); context.moveTo(i,0); context.lineTo(i,context.canvas.height); context.stroke(); } for(i= stepy +0.5;i<context.canvas.height;i+=stepy){ context.beginPath(); context.moveTo(0,i); context.lineTo(context.canvas.width,i); context.stroke(); }}// 橡皮筋画图模块var eraseAllButton = document.getElementById('eraseAllButton'), strokeStyleSelect = document.getElementById('strokeStyleSelect'), guidewireCheckbox = document.getElementById('guidewireCheckbox'), drawingSurfaceImageData, mousedown = {}, rubberbandRect = {}, dragging = false, guidewires = guidewireCheckbox.checked;function windowToCanvas(x, y){ var bbox = canvas.getBoundingClientRect(); return { x: x - bbox.left * (canvas.width/bbox.width), y: y - bbox.top * (canvas.width/bbox.width) };}function saveDrawingSurface(){ drawingSurfaceImageData = context.getImageData(0, 0, canvas.width, canvas.height);}function restoreDrawingSurface(){ context.putImageData(drawingSurfaceImageData, 0 ,0);}// loc 是基于屏幕坐标系下的鼠标指针当前坐标function updataRubberbandRect(loc){ rubberbandRect.width = Math.abs(loc.x - mousedown.x); rubberbandRect.height = Math.abs(loc.y - mousedown.y); if(loc.x>mousedown.x){ rubberbandRect.left = mousedown.x; } else{ rubberbandRect.left = loc.x; } if(loc.y>mousedown.y){ rubberbandRect.top = mousedown.y; } else{ rubberbandRect.top = loc.y; }}function drawRubberbandShape(loc){ context.beginPath(); context.lineWidth = 2.0; context.moveTo(mousedown.x, mousedown.y); context.lineTo(loc.x, loc.y); context.stroke();}function updateRubberband(loc){ updataRubberbandRect(loc); drawRubberbandShape(loc);}function drawHline(y){ context.beginPath(); context.moveTo(0, y+0.5); context.lineTo(canvas.width, y+0.5); context.stroke();}function drawVLine(x){ context.beginPath(); context.moveTo(x+0.5, 0); context.lineTo(x+0.5, canvas.height ); context.stroke(); }function drawGuidewires(x,y){ context.save(); context.strokeStyle = 'rgba(0,0,230,0.4)'; context.lineWidth = 1.0; drawVLine(x); drawHline(y); context.restore();}canvas.onmousedown = function(e){ var loc = windowToCanvas(e.clientX, e.clientY); e.preventDefault(); //saveDrawingSurface(); mousedown.x = loc.x; mousedown.y = loc.y; dragging = true;};canvas.onmousemove = function(e){ var loc; if (dragging) { e.preventDefault(); loc = windowToCanvas(e.clientX, e.clientY); //restoreDrawingSurface(); updateRubberband(loc); if (guidewires) { drawGuidewires(loc.x, loc.y); } }};canvas.onmouseup = function(e){ var loc = windowToCanvas(e.clientX, e.clientY); //restoreDrawingSurface(); updateRubberband(loc); dragging = false;};eraseAllButton.onclick = function(e){ context.clearRect(0, 0, canvas.width, canvas.height); drawGrid(context, 'lightgray', 10, 10); saveDrawingSurface();};strokeStyleSelect.onchange = function(e){ context.strokeStyle = strokeStyleSelect.value;};guidewireCheckbox.onchange = function(e){ guidewires = guidewireCheckbox.checked;};</script>
- HTML5 Canvas的一个有趣实例
- 一个不错的HTML5 Canvas多层点击事件监听实例
- 12个有趣的HTML5实例(转)
- [HTML5-Canvas] 使用HTML5 canvas完成的一个网页白板
- 国内一个有趣的HTML5网页。
- 一个有趣的html5手机锁
- 一个有趣的html5播放器
- HTML5 Canvas 基于OO的动画实例
- HTML的一个Canvas实例
- [HTML5-Canvas] HTML 5的<canvas>元素教程和实例
- HTML5 canvas 小实例
- HTML5 Canvas实例画板
- HTML5 canvas 实例
- HTML5 canvas入门实例
- 推荐一个html5 canvas的插件kineticjs
- 利用html5 canvas 画图的一个例子
- html5 canvas 一个漫天飞雪的效果
- 一个有趣的多线程应用实例
- linux之服务器构建
- 找到int最左边的那个1
- ssh密钥管理和认证代理
- CPLEX 解决大规模计算 变量 约束 添加方法
- 【Java工程师之路】[1-1.5]Java递归算法
- HTML5 Canvas的一个有趣实例
- perl 二维数组的用法实例
- spoj 1526 (BOI2007 day1) (费用提前计算相关的DP)
- Struts2学习笔记
- UVA 10382 - Watering Grass 贪心
- 刘汝佳 竖式问题(C语言)
- sqlplus 远程连接 oracle 12514 错误
- linux下vi命令大全
- UVA 112 Tree Summing