javascript的canvas绘图的基本用法
<canvas>是HTML里面非常强大的元素,利用它结合js可以实现很多动画效果,大大增强交互性。下面,我想用图文并茂的方式阐述一下canvas的绘图机制的基础内容,话不多说,先上代码:
HTML的内容很简单,就是一个画布canvas,其中width和height属性指定了画布的宽和高,并且我设置background为蓝色
以下为javascript的代码:首先是从DOM中获取canvas对象,然后通过canvas.getContext("上下文对象的名字(如2d)")方法从画布中获取上下文对象,if(canvas.getContext("2d")){。。。}这一条语句很重要,它用于检测getcontext()方法是否存在,某些浏览器是无法检测到getcontext()方法的(如firefox 3)。context对象的strokestyle和fillstyle属性分别用于设置描边和填充的颜色,调用context.fillRect(x1,y1,x2,y2)和context.strokeRect(x1,y1,x2,y2)分别用于描边和填充一个矩形(参数意义见代码注释)
<script type="text/javascript"> var canvas=document.getElementById("canvas");//获取画布 if(canvas.getContext("2d")){//检测是否能获取context对象 var context=canvas.getContext("2d");//从画布中获取上下文对象 context.strokeStyle="red";//设置描边的颜色 context.fillStyle="#008000"//设置填充的颜色 context.fillRect(10,10,50,50);//填充一个矩形,四个坐标分别为起始X,Y坐标和矩形的长宽 context.strokeRect(10,10,50,50);//画一个矩形,四个坐标分别为起始X,Y坐标和矩形的长宽 } </script>
demo的效果如下:
顺带一提,参数中的起点(x1,y1)是以canvas左上角为原点(0,0)计算的:(画图很渣,见谅)
<script type="text/javascript"> var canvas=document.getElementById("canvas");//获取画布 if(canvas.getContext("2d")){ var context=canvas.getContext("2d");//从画布中获取上下文对象 context.strokeStyle="red";//设置描边的颜色 context.fillStyle="#008000"//设置填充的颜色 context.fillRect(10,10,50,50);//填充一个矩形,四个坐标分别为起始X,Y坐标和矩形的长宽 context.strokeRect(10,10,50,50);//画一个矩形,四个坐标分别为起始X,Y坐标和矩形的长宽 context.clearRect(20,20,10,10);//清空一个矩形区域 } </script>
demo如下:
图中绿色的矩形区域中出现了一块空的矩形区域,显现出canvas的background的颜色--蓝色;
那么,大家可能会问,canvas的内容能不能转化为一张png或者jpg格式的图片呢?这当然是可以的,下面我就给大家演示一下:
<script type="text/javascript"> var canvas=document.getElementById("canvas");//获取画布 if(canvas.getContext("2d")){ var context=canvas.getContext("2d");//从画布中获取上下文对象 context.strokeStyle="red";//设置描边的颜色 context.fillStyle="#008000"//设置填充的颜色 context.fillRect(10,10,50,50);//填充一个矩形,四个坐标分别为起始X,Y坐标和矩形的长宽 context.strokeRect(10,10,50,50);//画一个矩形,四个坐标分别为起始X,Y坐标和矩形的长宽 context.clearRect(20,20,10,10);//清空一个矩形区域 var url= canvas.toDataURL();//将当前的画布(canvas)转化为url; var img=document.createElement("img");//创建一个img元素,并指定其src属性为url img.src=url; document.getElementsByTagName("body")[0].appendChild(img);//在当前body里追加新创建的img元素</span> } </script>
demo如下所示:(canvas的右边显示了一张与canvas内容相同的图片)
通过调用canvas的.toDataURL()方法可以将当前的画布(canvas)转化为url,同时()里的参数可以指定图片的格式,如canvas.toDataURL("image/jpg")则指定图片格式为jpg格式,若不指定则默认是png格式。HTML中的<img/>元素中有src属性,通过src="图片的url"便可以轻松引用图片啦!怎么样?很简单吧。
下面介绍一下canvas绘制路径的机制:
- 首先调用context.beginPath()方法开始绘图路径
- 然后通过调用一系列的方法绘制路径
- 最后通过调用context.stroke方法便可以将绘制的路径描绘出来
<script type="text/javascript"> var canvas=document.getElementById("canvas");//获取画布 if(canvas.getContext("2d")){ var context=canvas.getContext("2d");//从画布中获取上下文对象 context.strokeStyle="red";//设置描边的颜色 context.beginPath();//开始绘图路径 context.arc(50,50,49,0,Math.PI*2,true);//绘制外圆 context.stroke();//描边 } </script>
context.arc()中各个参数的意义:context.arc(绘图圆心 ,绘图圆心, 圆弧半径,起始角度,结束角度,逆时针绘制(true)或顺时针绘制(false))
demo如下,表示是以(50,50)为圆心,49为半径,按逆时针的方式从0绘制到2π的一个圆。
接下来我们再在大圆的中间画一个小圆:
<script type="text/javascript"> var canvas=document.getElementById("canvas");//获取画布 if(canvas.getContext("2d")){ var context=canvas.getContext("2d");//从画布中获取上下文对象 context.strokeStyle="red";//设置描边的颜色 context.beginPath();//开始绘图路径 context.arc(50,50,49,0,Math.PI*2,true);//绘制外圆 context.arc(50,50,30,0,Math.PI*2,true);//绘制内圆 context.stroke();//描边 } </script>
调用两次的context.arc()方法,demo如下;
那么问题就来了,为什么两圆的起始角(0度角)上会有一条线段呢?
原来,canvas绘图时是按照游标移动的方式进行绘制的,画完大圆时,canvas游标刚好又回到了大圆的0度角的位置,而小圆是从小圆的0度角开始绘制的,所以游标需要从大圆的0度角沿直线经过到小圆的0度角的位置,因此形成了这条线段。
那怎么才能去除这条线段呢?别急,canvas机制中有一个context.moveTo(X,Y)方法,能控制游标移动到相应的位置,只要我们在绘制完大圆之后,把游标移动到绘制小圆的初始位置上,不就可以了吗?代码如下,
<script type="text/javascript"> var canvas=document.getElementById("canvas");//获取画布 if(canvas.getContext("2d")){ var context=canvas.getContext("2d");//从画布中获取上下文对象 context.strokeStyle="red";//设置描边的颜色 context.beginPath();//开始绘图路径 context.arc(50,50,49,0,Math.PI*2,true);//绘制外圆 context.moveTo(80,50);//移动画笔游标到开始画内圆的位置 context.arc(50,50,30,0,Math.PI*2,true);//绘制内圆 context.stroke();//描边 } </script>
这时,线段也就消失啦!
我们还可以用同样的方式去绘制线段,context.lineto(X,Y)表示从上一点(canvas游标所在位置)移动到(X,Y)所在位置,让我们在小圆里面绘制两条垂直交叉的线段吧
<script type="text/javascript"> var canvas=document.getElementById("canvas");//获取画布 if(canvas.getContext("2d")){ var context=canvas.getContext("2d");//从画布中获取上下文对象 context.strokeStyle="red";//设置描边的颜色 context.beginPath();//开始绘图路径 context.arc(50,50,49,0,Math.PI*2,true);//绘制外圆 context.moveTo(80,50);//移动画笔游标到开始画内圆的位置 context.arc(50,50,30,0,Math.PI*2,true);//绘制内圆 context.moveTo(50,50); context.lineTo(50,25); context.moveTo(50,50); context.lineTo(25,50); context.stroke();//描边 } </script>
demo如下,是不是很像一个闹钟呢?
总结:其实canvas的内容非常丰富,我以上的内容讲解的不过是冰山一角,很多东西都需要深入的去学习。希望能带给大家一点点帮助吧
javascript的canvas绘图的基本用法的更多相关文章
- 每天一个JavaScript实例-canvas绘图
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 思维导图(自己整理,希望对大家有用):JavaScript函数+canvas绘图+Array数组
1.javascript函数: 2.Array数组: 3.canvas绘图:
- javascript权威指南第15章 使用Canvas绘图
HTML <!DOCTYPE html> <html> <head> <title>canvas</title> </head> ...
- 有趣的Javascript:只需一个JS让万恶的IE5、IE6、IE7、IE8全都支持H5原生Canvas绘图(有演示demo)
该demo支持IE5以上任意内核的浏览器 查看演示demo:支持IE5以上版本的浏览器Canvas绘图demo 补充:chats.js和echarts等图表库也可以使用本方法兼容IE6以上浏览器 1. ...
- Html5 学习系列(五)Canvas绘图API快速入门(2)
Canvas绘图API Demos 上一篇文章中,笔者已经给大家演示了怎么快速用Canvas的API绘制一个矩形出来.接下里我会在本文中给各位介绍Canvas的其他API:绘制线条.绘制椭圆.绘制图片 ...
- HTML5之Canvas绘图——使用Canvas绘制图形的基本教程
原文转自:http://www.cnblogs.com/picaso/archive/2012/11/26/2789077.html HTML5火的正热,最近有个想法也是要用到HTML的相关功能,所以 ...
- HTML5 canvas绘图基本使用方法
<canvas></canvas>是HTML5中新增的标签,用于绘制图形,实际上,这个标签和其他的标签一样,其特殊之处在于该标签可以获取一个CanvasRenderingCon ...
- HTML5之Canvas绘图(一) ——基础篇
HTML5火的正热,最近有个想法也是要用到HTML的相关功能,所以也要好好学习一把. 好好看了一下Canvas的功能,感觉HTML5在客户端交互的功能性越来越强了,今天看了一下Canvas绘图,下边是 ...
- HTML5 学习总结(四)——canvas绘图、WebGL、SVG
一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...
随机推荐
- The innocence is brilliant.
[11.20~12.20] 2016年的最后一个月在听Avril的歌,感觉她发音状态好好(对此建议去听<Wish You Were Here>!!!) 到此12月份的活都干完了吧~还剩最后 ...
- Sprint2团队贡献分
团队贡献分: 郭志豪:31% http://www.cnblogs.com/gzh13692021053/ 杨子健:22%http://www.cnblogs.com/yzj666/ 谭宇森:23% ...
- 数据泵Expdp和Impdp
一.数据泵导入导出技术 1.结构 2.目录对象 二.EXPDP参数 1.attach 2.content 3.directory 4.dumpfile 5.estimate 6.estimate_on ...
- PHP多级联动的学习(一)
我尝试在ThinkCMF中实现多级联动,首先我开始看了dede的联动类别管理前后台的代码以及他的数据库,经过非常多次的尝试,我渐渐有了一点想法,并给予实施. 首先写出前台的界面.如图. 然后在数据库中 ...
- HDU 4801 Pocket Cube
题目链接 去年现场,虎哥1Y的,现在刷刷题,找找状态... 一共6种转法,把3个面放到顶部,左旋和右旋,感觉写的还不错....都写成常数了. #include <stdio.h> #inc ...
- .net工具
程序名称 作者 说明 文件结构与元数据查看看 AssemblyView1.0 可以查看.net平台下exe,dll源代码的类结构,比如变量,属性,函数,事件的定义. Anakrino 源代码开 ...
- iOS 中 ARC 项目 兼容 MRC
iOS 项目中MRC 和 ARC 项目的代码兼容问题: 1.ARC 项目中导入 MRC 第三方类的时候要在此类上添加 -objc-arc. 2.MRC 项目中导入 ARC 类的时候要在次类上添加 -f ...
- mina通信 demo
1,要用到4个jar 2,服务端 package mina.server; import java.io.IOException; import java.net.InetSocketAddress; ...
- 可能是最通俗的Lempel-Ziv-Welch (LZW)无损压缩算法详述
最近工作正好接触到这一块,试着自己总结了一下,给需要的人提供一点帮助. 一.概述 首先看看百度百科里的一句话介绍:“LZW就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩.” 简单来 ...
- C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
本人今天遇到的错误,C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误. 测试了很久,才发现,是安全协议问题,把安全协议加上就可以了