1. 理解canvas

canvas其实是HTML5中一个新增加的标签,对于canvas标签本身并没有什么非常强大的属性(width、height、id、class、style),仅仅作为一个画布存在,只能使用js获取canvas绘图上下文环境(也就是获取CanvasRenderingContext2D对象啦)。下面用一段小程序来描述:

<canvas id="myCanvas" width="200" height="200" style="border:1px solid #000000;"></canvas>
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d"); // 获取CanvasRenderingContext2D对象

对于上述的CanvasRenderingContext2D对象,其实才是具有绘图本领,它拥有HTML5绘图的API,所以canvas绘图仅仅是操作CanvasRenderingContext2D对象罢了。

2. 使用CanvasRenderingContext2D对象来画一条直线

// 绘制路径(并没有画,只是状态的设置)
ctx.moveTo(100,100); // 移动点到 100 , 100
ctx.lineTo(200,200); // 连接上一个点到 200 , 200 // 用线条根据状态中路径(进行绘图)
ctx.stroke();

因为canvas是基于状态的绘图,所以在绘制所有路径之前,还可以设置一些其他状态参数,比如直线还可以设置 lineWidth, strokeStyle 等属性。

ctx.lineWidth = 10; // 线条宽度
ctx.strokeStyle = 'blue'; // 线条颜色
ctx.moveTo(100,100);
ctx.lineTo(200,200);
ctx.stroke();

3. beginPath() 和 closePath() 的使用

由于canvas是基于状态的绘制,所以如果不指定beginPath(),每次调用绘制函数stroke都会将canvas所有的路径进行重新绘制,而达不到我们想要的效果,下面是一段beginPath()的使用的小程序:

ctx.lineWidth = 10;

ctx.beginPath(); // 进行一次全新的绘制
ctx.moveTo(50,50); // == ctx.lineTo(50,50);
ctx.lineTo(100,100);
ctx.strokeStyle = 'red';
ctx.stroke(); ctx.beginPath(); // 进行一次全新的绘制
ctx.moveTo(60,60);
ctx.lineTo(120,120);
ctx.strokeStyle = 'green';
ctx.stroke(); ctx.beginPath(); // 进行一次全新的绘制
ctx.moveTo(70,70);
ctx.lineTo(140,140);
ctx.strokeStyle = 'blue';
ctx.stroke();

其实在canvas绘图中,最好的方式是将绘制路径的函数放在beginPath()和closePath()之间,beginPath表示进行一次全新的绘制,closePath表示当前绘制的图形应该封闭并且结束。它们成对的出现主要是来绘制一些封闭的图形。

ctx.lineWidth = 10;

ctx.beginPath();
ctx.moveTo(50,50);
ctx.lineTo(100,100);
ctx.closePath(); // 封闭当前路径,并且结束
ctx.strokeStyle = 'red';
ctx.stroke(); ctx.beginPath();
ctx.moveTo(60,60);
ctx.lineTo(120,120);
ctx.closePath(); // 封闭当前路径,并且结束
ctx.strokeStyle = 'green';
ctx.stroke(); ctx.beginPath();
ctx.moveTo(70,70);
ctx.lineTo(140,140);
ctx.closePath(); // 封闭当前路径,并且结束
ctx.strokeStyle = 'blue';
ctx.stroke();

4. 填充一个封闭图形使用fill()和fillStyle

ctx.lineWidth = 10;

ctx.beginPath();
ctx.moveTo(50,50);
ctx.lineTo(100,100);
ctx.closePath();
ctx.strokeStyle = 'red';
ctx.stroke(); ctx.beginPath();
ctx.moveTo(60,60);
ctx.lineTo(120,120);
ctx.closePath();
ctx.strokeStyle = 'green';
ctx.stroke(); ctx.beginPath();
ctx.moveTo(70,70);
ctx.lineTo(140,140);
ctx.closePath();
ctx.strokeStyle = 'blue';
ctx.stroke(); ctx.fillStyle = 'yellow'; // 填充颜色
ctx.fill(); // 填充绘制

上述程序其实是错误的,正确的程序应该是先填充绘制在进行stroke操作。

ctx.lineWidth = 10;
ctx.fillStyle = 'yellow'; ctx.beginPath();
ctx.moveTo(50,50);
ctx.lineTo(100,100);
ctx.closePath();
ctx.fill();
ctx.strokeStyle = 'red';
ctx.stroke(); ctx.beginPath();
ctx.moveTo(60,60);
ctx.lineTo(120,120);
ctx.closePath();
ctx.fill();
ctx.strokeStyle = 'green';
ctx.stroke(); ctx.beginPath();
ctx.moveTo(70,70);
ctx.lineTo(140,140);
ctx.closePath();
ctx.fill();
ctx.strokeStyle = 'blue';
ctx.stroke();

5. 矩形

由于矩形是非常常用的一种图形,所以canvas提供一个api可以快速进行矩形的绘制(rect(x,y,width,height)函数)。

// 画一个矩形
// ctx.moveTo(x,y);
// ctx.lineTo(x+width,y);
// ctx.lineTo(x+width,y+height);
// ctx.lineTo(x,y+height);
ctx.rect(x,y,width,height); // 建立路径

其实还有更加方便的方法:fillRect(x,y,width,height) 和 strokeRect(x,y,width,height),这两个方法不但进行建立矩形路径还进行矩形的绘制

// ctx.beginPath();
// ctx.rect(x,y,width,height);
// ctx.closePath();
// ctx.stroke(); | ctx.fill();
ctx.strokeRect(x,y,width,height); | ctx.fillRect(x,y,width,height);

HTML5-Canvas 初认识的更多相关文章

  1. HTML5 程序设计 - 使用HTML5 Canvas API

    请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...

  2. 赠书:HTML5 Canvas 2d 编程必读的两本经典

    赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide( ...

  3. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  4. html5 canvas常用api总结(一)

    1.监听浏览器加载事件. window.addEventListener("load",eventWindowLoaded,false); load事件在html页面加载结束时发生 ...

  5. HTML5 Canvas绘制转盘抽奖

    新项目:完整的Canvas转盘抽奖代码 https://github.com/givebest/GB-canvas-turntable 演示 http://blog.givebest.cn/GB-ca ...

  6. html5 canvas首屏自适应背景动画循环效果代码

    模板描述:html5 canvas首屏自适应背景动画循环效果代码 由于动态图太大,怕以后服务器受不了,所以现在都改为静态图了,大家点击演示地址一样的,希望大家喜欢,你们的支持就是小海的动力!! 欢迎大 ...

  7. 自己写的HTML5 Canvas + Javascript五子棋

    看到一些曾经只会灌水的网友,在学习了前端之后,已经能写出下载量几千几万的脚本.样式,帮助大众,成为受欢迎的人,感觉满羡慕的.我也想学会前端技术,变得受欢迎呀.于是心血来潮,开始学习前端知识,并写下了这 ...

  8. HTML5 Canvas彩色小球碰撞运动特效

    脚本简介 HTML5 Canvas彩色小球碰撞运动特效是一款基于canvas加面向对象制作的运动小球动画特效.   效果展示 http://hovertree.com/texiao/html5/39/ ...

  9. 学习笔记:HTML5 Canvas绘制简单图形

    HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...

  10. 基于HTML5 Canvas实现的图片马赛克模糊特效

    效果请点击下面网址: http://hovertree.com/texiao/html5/1.htm 一.开门见山受美国肖像画家Chuck Close的启发,此脚本通过使用HTML5 canvas元素 ...

随机推荐

  1. Python错误和异常 学习笔记

    错误和异常概念 错误:     1.语法错误:代码不符合解释器或者编译器语法     2.逻辑错误:不完整或者不合法输入或者计算出现问题 异常:执行过程中出现万体导致程序无法执行     1.程序遇到 ...

  2. vue笔记 - 组件间通信 之 中央事件总线bus

    中央事件总线 - 就是一个名字可以叫做bus的vue空实例,里边没有任何内容: var bus = new Vue(); 人如其名,她就像一个公交车一样,来回输送人,将a站点的A输送到b站点,再将b站 ...

  3. Android NDK学习(4)使用cygwin生成.so库文件

    转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817389.html 简单的示例: makefile文件: LOCAL_PATH: ...

  4. Android 本地tomcat服务器接收处理手机上传的数据之案例演示

    上一篇:Android 本地tomcat服务器接收处理手机上传的数据之环境搭建     本篇基于上一篇搭建的服务器端环境,具体介绍Android真机上传数据到tomcat服务器的交互过程   场景:A ...

  5. 【OOP】C++ const成员函数

    预备知识 1.代码转换分析技巧 在早期某些编译器会将C++代码翻译为C代码,然后使用C编译器生成可执行文件.其中翻译的一个转化就是:将this指针显式添加到成员函数的第一个参数位置上,并在成员函数调用 ...

  6. matlab的m程序转执行文件exe

    转换主要有两步: 第一步 设置编译器 在命令窗口输入 mbuild -setup 根据提示操作即可,.如下图我的设置 第二步 转换执行文件 命令行输入 mcc -m main   即可(输入 mcc ...

  7. CMOS构成的常见电路

    CMOS门电路 以MOS(Metal-Oxide Semiconductor)管作为开关元件的门电路称为MOS门电路.由于MOS型集成门电路具有制造工艺简单.集成度高.功耗小以及抗干扰能力强等优点,因 ...

  8. 【CF720D】Slalom 扫描线+线段树

    [CF720D]Slalom 题意:一个n*m的网格,其中有k个矩形障碍,保证这些障碍不重叠.问你从(1,1)走到(n,m),每步只能往右或往上走,不经过任何障碍的方案数.两种方案被视为不同,当且仅当 ...

  9. 【CF815D】Karen and Cards 单调栈+扫描线

    [CF815D]Karen and Cards 题意:一张卡片有三个属性a,b,c,其上限分别为A,B,C,现在有n张卡片,定义一张卡片能打败另一张卡片当且仅当它的至少两项属性要严格大于另一张的对应属 ...

  10. split陷阱

    如果split最后一个为空,则要这么写 String[] lines=line.split(",",-1);