Html5 的Canvas使用
来源:互联网 发布:西瓜播放器mac版 编辑:程序博客网 时间:2024/05/16 06:16
随着安卓的迅猛发展,native app的发展让我们程序员有点蛋疼,随着现在什么微信,淘宝等好像里面的web app的成分也是越来越重,让我们原生app开发者不得不警惕起来,有什么办法呢,还得自己去学咯,个人还是不敢苟同web app将会替代native app,但是html5的功能确实是非常的强大,然后里面的新标签比如canvase,svg都让我们不得不也联想安卓api里面也是canvas用的方法差不多,然后5.x后也是推出了svg,看来安卓的native app的开发与html5的距离又拉近了,也不会在为某个动画和贝塞尔曲线搞的蛋疼,那就有必要去学习html5咯。
学习开发一个新的东西总是苦难的,那么我们就从基础来开始把。
<canvas></canvas>是html5出现的新标签,像所有的dom对象一样它有自己本身的属性、方法和事件,其中就有绘图的方法,js能够调用它来进行绘图 。
还记的javaee的时候也是有document.getElementById()或byName(),同样也是还是支持w3c的规范,还是javaScript和css,所以我们就不应该去畏惧。那么我们就先来看下canvas的基础吧,其实里面的东西还真不多,也就是画线和画图片,和安卓自定义view里面的onDraw()一样的去写东西就好了。
基础学习:
(1)context:一直觉得这个翻译成“上下文”真够蛋疼的,context是一个封装了很多绘图功能的对象,获取这个对象的方法是
var context =canvas.getContext("2d");//var 就是一个弱类型而已,再也没有java里面的什么基本数据类型什么的了
(2) 画的方式
canvas元素绘制图像的时候有两种方法,分别是:context.fill()//填充 context.stroke()//绘制边框
是不是和安卓里面的很像,安卓里面有fill、stroke、fillAndStroke,fill就是内容填充,stroke就是边框
(3) style:在进行图形绘制前,要设置好绘图的样式: context.fillStyle//填充的样式 context.strokeStyle//边框样式
(4)context.lineWidth//图形边框宽度 ,安卓里面呢是strokeWidth,反正都差不多吧
(5)颜色的表示方式:
直接用颜色名称:"red" "green" "blue"
十六进制颜色值: "#EEEEFF"
rgb(1-255,1-255,1-255)
rgba(1-255,1-255,1-255,透明度)
然后属性介绍完了,然后我们来绘制图形了
绘制矩形
context.fillRect(x,y,width,height) //实心矩形
strokeRect(x,y,width,height)//空心矩形
清除矩形区域 (这个注意下)
context.clearRect(x,y,width,height)
圆弧
context.arc(x, y, radius, starAngle,endAngle, anticlockwise)
经过试验证明书本上ture是顺时针,false是逆时针是错误的,而且无论是逆时针还是顺时针,角度都沿着顺时针扩大,如下图:
然后我们还有画线的方法context.moveTo(x,y) //是不是和安卓path的方法一样(moveTo,lineTo)
context.lineTo(x,y)
每次画线都从moveTo的点到lineTo的点, 如果没有moveTo那么第一次lineTo的效果和moveTo一样,每次lineTo后如果没有moveTo,那么下次lineTo的开始点为前一次lineTo的结束点。
路径(重点)
context.beginPath()
context.closePath()
得出的结论有:*号为重点
1、系统默认在绘制第一个路径的开始点为beginPath
*2、如果画完前面的路径没有重新指定beginPath,那么画第其他路径的时候会将前面最近指定的beginPath后的全部路径重新绘制
3、每次调用context.fill()的时候会自动把当次绘制的路径的开始点和结束点相连,接着填充封闭的部分
如果没有closePath那么前面的路劲会保留,实验证明正确的结论是 如果没有重新beginPath那么前面的路劲会保留,记住每次画路径都在前后加context.beginPath() 和context.closePath()就行
最后我们来个小例子练练手。<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title></head><body> <canvas id="canvas" style="border: 1px solid #ff0000;display: block;align-content: center" width="368" height="624"></canvas> <script> window.onload =function(){ var canvas=document.getElementById("canvas"); canvas.height=624; canvas.width=368; if(canvas.getContext("2d")){ var context=canvas.getContext("2d"); draw(context); }else{ alert("当前浏览器不支持Canvas,请更换浏览器后再试"); } } function draw(cxt){ cxt.save(); head(cxt); backbone(cxt); fishtail(cxt); cxt.restore(); } // 头 function head(context){ context.beginPath(); context.moveTo(100, 100); context.quadraticCurveTo(200, -50, 300, 100); context.moveTo(100, 100); context.lineTo(300, 100); context.stroke(); context.beginPath(); context.arc(200, 60, 10, 0, Math.PI * 2, false); context.stroke(); context.beginPath(); context.fillStyle = 'wilte'; context.arc(200, 60, 5, 0, Math.PI * 2, false); context.fill(); } //骨干 function backbone(context){ context.moveTo(190, 100); //fillRect(x, y, width, height)x, y 矩形的左上角的坐标width, height 矩形的大小 context.strokeRect(190, 100, 20, 35); context.closePath(); context.stroke(); for(var y = 150; y <= 450; y+=50){ twoBackbone(context, y); } } function twoBackbone(context, y){ context.beginPath(); context.arc(200, y, 15, 0, Math.PI * 2, false); //圆形 context.closePath(); context.stroke(); //左排骨 context.beginPath(); context.moveTo(185,y); context.quadraticCurveTo(75, y + 25, 165, y + 40); context.lineWidth = 4; context.stroke(); //右排骨 context.beginPath(); context.moveTo(215,y); context.quadraticCurveTo(320, y + 25, 235, y + 40); context.stroke(); context.beginPath(); context.lineWidth = 1; var height = 20; if(y == 450){ height = 35; } context.strokeRect(190, y + 15, 20, height);//矩形 context.closePath(); context.stroke(); } //鱼尾 function fishtail(context){ context.beginPath(); context.moveTo(190, 500); context.lineTo(110, 560); context.moveTo(210, 500); context.lineTo(290, 560); context.moveTo(110, 560); context.lineTo(200, 540); context.lineTo(290, 560); context.moveTo(200, 500); context.lineTo(200, 540); twoFishtail(context); context.stroke(); } function twoFishtail(context){ var j = 10; //右侧 for(var i = 0; i <= 50; i += 10,j += 10){ context.moveTo(200 + j, 500 + i); context.lineTo(200 + j, 540); } j = 0; //左侧 for(var i = 0; i <= 50; i += 10,j -= 10){ context.moveTo(190 + j, 500 + i); context.lineTo(190 + j, 540); } } window.addEventListener("load", draw, true); </script></body></html>效果图:
媽蛋,睡觉。。。。。。。。。
- Html5 的Canvas使用
- html5 canvas的使用
- html5的canvas使用:时钟
- HTML5中canvas的使用
- [HTML5-Canvas] 使用HTML5 canvas完成的一个网页白板
- HTML5的canvas元素的简单使用
- 使用HTML5 Canvas实现的玫瑰线
- 使用 HTML5 canvas 绘制精美的图形
- HTML5学习(2) canvas的使用一
- HTML5中canvas的使用介绍
- html5中的canvas和svg的使用
- HTML5-Canvas画布的使用
- 使用 HTML5 canvas 绘制精美的图形
- html5 使用canvas画线
- html5 canvas使用
- HTML5>canvas基本使用
- HTML5 - Canvas标签<使用>
- HTML5 Canvas使用
- [1108]:最小公倍数
- hi
- 详解Java中的ThreadLocal、ThreadLocalMap和Thread之间的关系
- Chapter 5-04
- 顺序表的查找
- Html5 的Canvas使用
- iOS 网络请求类封装
- 文章标题
- spring mvc怎么获取上传文件的原路径
- mina框架分析---2
- aircrack-ng破解wifi密码基础教程
- Mac 使用技巧之-使用brew安装软件
- 机器学习笔记_数学基础_2-概率论
- 华为服务器安装linux系统--虚拟光驱iso