内容简介:很多人知道canvas,但不一定都熟悉或者经常使用,作为一种专项工具,如果业务不是跟图像或者图表强相关,的确不常用,但对它的学习和了解还是必要的,这篇文章我们就一起来入个门。可以理解为,它提供了一块画布,在它所掌控的区域,可以运用各种方法绘制图形、文本,或者制作动画、处理图像,等等。通常我们能够看到一些炫酷的动画,很多都是canvas做出来的,但是需要各种元素和技巧综合使用,不是一蹴而就的,我们先从基础看起。
很多人知道canvas,但不一定都熟悉或者经常使用,作为一种专项工具,如果业务不是跟图像或者图表强相关,的确不常用,但对它的学习和了解还是必要的,这篇文章我们就一起来入个门。
Canvas是什么
可以理解为,它提供了一块画布,在它所掌控的区域,可以运用各种方法绘制图形、文本,或者制作动画、处理图像,等等。
通常我们能够看到一些炫酷的动画,很多都是canvas做出来的,但是需要各种元素和技巧综合使用,不是一蹴而就的,我们先从基础看起。
搭好舞台
var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); <canvas id="canvas" width="150" height="150"></canvas> 复制代码
三行代码,完成舞台搭建。
绘制的几要素
位置:从哪里开始
路径:图形的轨迹
轮廓:绘制空心图形
填充:绘制实心区域
用代码来表达就是:
画笔位置——moveTo(x, y)
将画笔移动到指定的坐标x、y。
直线——lineTo(x, y)
绘制一条从当前位置到指定位置的直线。
圆弧——arc(x, y, radius, startAngle, endAngle, anticlockwise)
画一个以(x,y)为圆心、以radius为半径的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成。
矩形——rect(x, y, width, height)
绘制一个左上角坐标为(x,y),宽高为width以及height的矩形。
几个基本的图形就是这样了,还有一种比较复杂的是贝塞尔曲线。
二次贝塞尔——quadraticCurveTo(cp1x, cp1y, x, y)
三次贝塞尔——bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
什么是较复杂的图形呢?比如:气泡、心形,或者其他不是很常规的形状,如使用上面的方法就较难实现,贝塞尔曲线更能胜任。
那其实除了这些,canvas还有两个动作要做,就是 开始 和 结束 绘制的指令,分别是:
beginPath()和 closePath()
放在路径绘制的开端和末尾,就像这样:
ctx.beginPath(); ctx.moveTo(125,125); ctx.lineTo(125,45); ctx.lineTo(45,125); ctx.closePath(); 复制代码
(如果路径本身就是闭合的,可以省去closePath,但一般建议保留)
完成这些之后,就可以进行下一步,绘制轮廓,或者填充区域,当然,可以两者都做:
ctx.stroke(); //轮廓 ctx.fill(); //填充 复制代码
除了这两个操作,还有其他的操作,比如设置色值、线宽、是否旋转等,后面做丰富示例时我们再一一介绍。
完整示例如下:
var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.moveTo(125,125); ctx.lineTo(125,45); ctx.lineTo(45,125); ctx.closePath(); ctx.stroke();//轮廓 ctx.beginPath(); ctx.arc(200, 200, 40, 0, 36, false); ctx.closePath(); ctx.fillStyle="rgb(2,100,30)";//填充颜色 ctx.fill();//填充 复制代码
这只是一个很简单的效果,我们也看到了路径之后其他设置项的出现,就是填充颜色,这只是其中之一,但这里暂时不详述,我们先看看,除了图形,canvas还能做什么?
文本和图片
文本很好实现,直接上代码:
ctx.font = "48px serif"; //字号、字体类型 ctx.fillText("Hello world", 10, 300); // 文字内容和位置 复制代码
但其实文字也是有两种效果的,填充和轮廓,上面这种是填充:
如果把第二行代码换成:
ctx.strokeText("Hello world", 10, 50); 复制代码
就是轮廓了
除此之外,还有一些对齐方式和文本方向的设置,先略去。
来看看图片
图片分为两块,处理图片和绘制图片。
获取同页面内的图片不再赘述,跟通常的dom操作一样,看看创建图片的方法:
var img = new Image(); // 创建一个<img>元素 img.src = 'myImage.png'; // 设置图片源地址 复制代码
获取或者创建了图像,怎么把它绘制到canvas里去呢?
drawImage(image, x, y)
其中 image 是 image 或者 canvas 对象,x 和 y 是其在目标 canvas 里的起始坐标。
比如我们可以把上面的代码写成这样:
var ctx = document.getElementById('canvas').getContext('2d'); var img = new Image(); img.onload = function(){ ctx.drawImage(img,0,0); } img.src = '/img/canvas_intro/canvas_01.png'; 复制代码
上面这段代码,我把当前页面的三角形拿了过来,就是跟前面那个效果一样的了
这里只是把图像放入我们的工作区,如果想在这个区域画别的图形亦可,代码接着往下写就好了,有时候这可以为我们节省成本,比如,稍复杂一点的图像作为背景,简单的图形作为前景画出。
那其实这个方法也不止这么简单,它有两个变种
缩放
drawImage(image, x, y, width, height)
即指定图像大小,也就是可以根据需要进行缩放。
裁切
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
一长串参数看着有点头皮发麻,但就因为这样,才能让我们去操作细节,它是用来裁切图像的。
前面四个用来处理图片源的剪切起始位置和大小,就跟我们平时截图一个道理,后面的参数,是将裁切后的图像,放置在画布的什么位置,以及那个区域的大小。如下所示:
小结
这篇文从零开始介绍了canvas的 工具 箱里有哪些工具,虽然尚不完整,作为开端,已经够多,先到这,更多功能我们下篇再聊~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 2016 收获与新起点
- 工控系统安全的起点:安全审计的三个步骤
- Java学习路线?迷茫在Java EE的起点。。。
- Java学习路线?迷茫在Java EE的起点。。。
- 以去中心化身份为起点,走出信任的“囚徒困境”
- tsp的理论与实践系列(4)单起点的任务分配
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构、算法与应用(原书第2版)
Sartaj Sahni / 王立柱、刘志红 / 机械工业出版社 / 2015-4 / 79.00元
《数据结构、算法与应用——C++语言描述》是享有盛誉的数据结构教科书的第2版。它完整地包含了基本数据结构的内容,是CS2课程的理想用书。作者Sartaj Sahni通过循循善诱的讲解、直观具体的讨论和基于现实的应用,让读者轻松、愉快地学习。新版书着重利用标准模板库(STL),把书中开发的数据结构和算法与相应的STL实现方法相互关联。本书还增加了很多新的实例和练习题。 书中的应用实例是它的特色......一起来看看 《数据结构、算法与应用(原书第2版)》 这本书的介绍吧!