前面讲了一部分的canvasAPI的基础知识,光看API的介绍确实是很无趣乏味,需要一点可以激发内心的激情的东西来激励自己来学习,于是就了伴随canvasAPI学习的小实例,这样通过API的知识,结合小实例的应用,就可以更好的去理解canvas的这些属性和方法,也可以激发自己创造canvas特效的灵感和感觉,恩恩,请叫我雷锋,不谢!

下面给大家带来的这里小实例很简单,是一个简易的绘图工具,先看看效果吧!

效果先描述一下哈:这里有一个canvas画布和几个按钮,canvas画布是一个画板,可以画任何的图形,按钮可以设置画板的画笔颜色,也可以清除画板,当然,你要是画出一副旷世奇画,请点击右键将图片另存为,你懂的!

那这个是怎么做的呢?

我先说原理在贴代码,方便大家理解,我都这样了,就不要直接拿来主义了哈!

原理其实很简单,这里用到的核心的方法是lineTo()和stroke(),看过前面的API文章的同学应该明白是什么意思,就是划线嘛

当在画布中,如果按下鼠标,我们将画布的起始点放在此时鼠标的位置,用到的是moveTo(),然后鼠标移动的时候,用lineTo()画路径,用stroke()来填充路径,移一下画一下,这样就能画出曲线来,当鼠标抬起的时候,我们只需要取消鼠标的动作即可,如果你看过我写的鼠标拖拽效果,是不是感觉很像啊,对的,思路跟拖拽是差不多的,只是具体的内容不一样而已,如果你没看过鼠标的拖拽效果,可以看这里 鼠标拖拽

下面的按钮因为各自控制的东西不一样,我用了一个switch方法来给各自添加效果,设置颜色用到的canvas属性是strokeStyle,清除画布的方法在API里面没有讲到,可能是讲漏了,这里说一下吧,这里是用的clearRect()方法,还是说一下吧:

clearRect(x,y,w,h)  在给定的矩形内清除指定的像素

参数:x,y 表示要清除的矩形的左上角的坐标, w,h 表示要清除的矩形的宽高

看到这参数,我们可以了解到,它可以清除局部的画布的内容,也可以清除整个画布的内容,看你给多大的区域了,本实例是清除的整个画布,因为我们需要整个画布都清除掉,如果你只想清除你不想要的那块,可以设置一个精确的区域,我就不在这里啰嗦了!

大致的原理就这么简单,我把代码贴出来供大家参考理解,顺便把效果地址贴出来体验一下,废话不多说了,看代码:

css:

*{ padding:; margin:;}
body{ background:#ccc;}
canvas{ background:#fff; margin:50px 10px; }
input{ display:inline-block; width:80px; height:30px; cursor:pointer; margin-left:10px;}

html:

 <canvas width="500" height="500" id="canvas">
<span>亲,您的浏览器不支持canvas,换个浏览器试试吧!</span>
</canvas>
<div>
<input type="button" value="红画笔" id="red">
<input type="button" value="绿画笔" id="green">
<input type="button" value="蓝画笔" id="blue">
<input type="button" value="重置颜色" id="default">
<input type="button" value="清除画布" id="clear">
</div>

js:

window.onload = function(){
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var oInput = document.getElementsByTagName("input"); for(var i=0;i<oInput.length;i++){
oInput[i].onclick = function(){
var ID = this.getAttribute('id');
switch(ID){
case 'red':
ctx.strokeStyle = 'red';
break;
case 'green':
ctx.strokeStyle = 'green';
break;
case 'blue':
ctx.strokeStyle = 'blue';
break;
case 'default':
ctx.strokeStyle = 'black';
break;
case 'clear':
ctx.clearRect(0,0,canvas.clientWidth,canvas.clientHeight);
break;
}
}
}
draw();
function draw(){
canvas.onmousedown = function(ev){
var ev = ev || event;
ctx.beginPath();
ctx.moveTo(ev.clientX-canvas.offsetLeft,ev.clientY-canvas.offsetTop);
document.onmousemove = function(ev){
var ev = ev || event;
ctx.lineTo(ev.clientX - canvas.offsetLeft,ev.clientY - canvas.offsetTop);
ctx.stroke();
}
document.onmouseup = function(ev){
document.onmousemove = document.onmouseup = null;
ctx.closePath();
} }
} }

哦,这里的一个细节忘记交代了,就是必须在绘图部分加上路径闭合,即beginPath()和closePath(),为什么?因为在每次鼠标抬起之后,切换下面的样式或者清除画布的时候,如果路径不闭合的话,那么后面的操作会污染前面所画的东西,比如前面用红画的,现在我切换到绿色,现在画的和原来画的都变成绿了,比如清除画布,画过一次之后清除,然后再画的时候第一次画的东西又出来了,这都不是我们想要的,所以此点需谨记!

效果演示请看这里:

canvas画板小实例

以后慢慢会带来更多的小实例供大家参考,写的不是很好,万望不要嫌弃,也希望大家多多的关注我,这才是我最大的动力了,哈哈!

大致就是这样,谢谢大家!

canvas实践小实例一 —— 画板工具的更多相关文章

  1. canvas实践小实例二 —— 扇形

    俗话说:发图不留种,菊花万人捅!我这里想延伸一下:教学不给例,说你是傻逼!哎呀,还挺押韵,嘻嘻,开个玩笑! 我们都讲了四期API的知识了,估计大家看的也是枯燥的很啊,前面的小实例也是太简单,简直不解渴 ...

  2. HTML5自学笔记[ 13 ]canvas绘图小实例之方块移动

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. canva实践小实例 —— 马赛克效果

    前面给大家带来了操作像素的API,此时此刻,我觉得应该配以小实例来进行进一步的说明和演示,以便给大家带来更宽广的视野和灵感,你们看了我的那么多的文章,应该是懂我的风格,废话不多说,进入正题: 这次给大 ...

  4. HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. HTML5 小实例

    1.时钟: <!doctype html> <html> <head></head> <body> <canvas id=" ...

  6. javascript小实例,拖拽应用(一)

    前面我们将了一下拖拽的基本思想,理论是有了,那实践呢,可以运用到什么地方呢?下面就给大家带来一个用拖拽思想写的一个小实例,供大家参考,大致效果看下图: 就是这样一个简单的一个拖拽条,你可以把它理解为滚 ...

  7. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  8. Playmaker全面实践教程之Playmaker常用工具

    Playmaker全面实践教程之Playmaker常用工具 Playmaker常用工具 Playmaker插件搭载了8个工具:FSM Browser.State Browser.Templates.T ...

  9. ActiveMQ消息队列和SignalR之日志实时监控及警报小实例

    主要技术: log4net-生成日志. ActiveMQ-生成日志的时候发送消息,并实时监控日志. SignalR-将ActiveMQ监控的日志实时显示到浏览器上,而不用刷新浏览器. 小实例介绍: 左 ...

随机推荐

  1. meta之renderer

    今天不小心看了下慕课网首页的源码,看到有一行 1 <meta name="renderer" content="webkit|ie-comp|ie-stand&qu ...

  2. 【Gym 100947E】Qwerty78 Trip(组合数取模/费马小定理)

    从(1,1)到(n,m),每次向右或向下走一步,,不能经过(x,y),求走的方案数取模.可以经过(x,y)则相当于m+n步里面选n步必须向下走,方案数为 C((m−1)+(n−1),n−1) 再考虑其 ...

  3. 【kAri OJ】wzt的树

    时间限制 1000 ms 内存限制 65536 KB 题目描述 改革春风吹满地,中国人民真争气!家庭联产承包责任制以后,全国人民争想发家致富.wzt于是包了一个山头来种植金丝楠木,花了好几年种了N棵树 ...

  4. SpringMVC数据库链接池,以及其他相关配置

    1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  5. POJ3264 Balanced Lineup

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 44720   Accepted: 20995 ...

  6. POJ1995 Raising Modulo Numbers

    Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6373   Accepted: ...

  7. shell与变量的声明的操作

    1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...

  8. Spring IoC、DI入门小程序

    Alt+/智能提示xml配置文件节点及属性:在接口上使用Ctrl+T可以提示其实现类 一.IoC控制反转(将创建对象的权利交给spring)入门小程序 1.引入jar包 2.工程基本结构 3.新建Us ...

  9. Android往SD卡上存储文件

    public class DataActivity extends Activity { private EditText filenameText; private EditText content ...

  10. C++中的异常处理(二)

    C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报  分类: C++编程语言(24)  版权声明:本文为博主原创文章,未经 ...