<canvas>元素是HTML5中的绘图元素,通过定义一个画布区域,然后使用javascript动态地在这个区域里面绘制图形,对于2D和3D图形都可以绘制,我们将其分成2D上下文和WebGL两大块内容来一起来学习,但是WebGL觉得比较少用到,而且难,所以不讲了!
一、了解canvas
<canvas id=‘draw’ width=‘200’ height=‘200' > nothing </canvas>,这是便是一个基本canvas元素的写法了,但是我们必须通过javascript来动态获得,那么需要这样:

  1. var draw = document.getElementById(‘draw’);
  2. //确定是否支持canvas
  3. if(draw.getContext){
  4. //这样就取得绘图上下文对象的引用,画图便可以开始了!
  5. var context = draw.getContext(‘2d’);
  6. //取得图像的数据uri,显示图像
  7. var imageuri = draw.toDataURL(‘image/png’);
  8. var img = document.createElement(‘img’);
  9. img.src= imageuri;
  10. document.body.appendChild(img);
  11. }

二、2D上下文
对于2D上下文的坐标是开始于canvas元素的左上角的,原点的坐标为(0,0),x轴越往右越大,y轴越往下越大就算但画布的原坐标发生translate也不例外,如下图:

填充(使用指定样式[颜色、渐变、图像、模式等]填充图形)和描边(图形的边缘画线)分别为fillStyle和strokeStyle,需要注意一点,fillStyle和strokeStyle会被延用至重新设置这两个值!

  1. var draw = document.getElementById(‘draw’);
  2. if(draw.getContext){
  3. var context = draw.getContext(‘2d’);
  4. context.strokeStyle = “#”;
  5. context.fillStyle = ‘#0000ff’;
  6. }

绘制矩形,有以下方法fillRect()、strokeRect()、clearRect()的方法,都是一样的,传入四个参数,矩形的x坐标、矩形的y坐标、矩形的宽度width、矩形的高度height,

  1. var draw = document.getElementById(‘draw’);
  2. if(draw.getContext){
  3.  
  4. var context = draw.getContext(‘2d’);
  5. //绘制黑色矩形
  6. context.strokeStyle = “#”;
  7. context.strokeRect(,,,);
  8. //绘制黑色矩形
  9. context.strokeStyle = “#”;
  10. context.fillRect(,,,);
  11.  
  12. //在两个填充矩形重叠的地方清除一个小矩形
  13. context.clearRect(,,,);
  14.  
  15. //绘制描边矩形
  16. context.fillStyle = ‘#0000ff’;
  17. context.fillRect(,,,);
  18.  
  19. }

绘制路径,2d上下文有很多在画布上绘制路径的方法,可以创造出复杂的形状和线条。要绘制路径,首先需要调用beginPath()方法,
arc(x,y,radius,startAngle,endAngle,counterclockwise),意思是以(x,y)为圆心,radius为半径,counterclockwise的值为false的时候顺时针画圆(或圆弧),开始角度startAngle,结束角度endAngle,用弧度表示;
arcTo(x1,y1,x,y,radius),意思是从(x1,y1)到(x,y),以radius为半径,画一条弧线;
lineTo(x,y),意思是从上一个点画一条直线至(x,y);
moveTo(x,y),意思是将绘图的游标移至(x,y),也就是从此点开始绘制;
rect(x,y,width,height),这是画个矩形,就不多说了;
bezierCurveTo(x1,y1,x2,y2,x,y),意思从上一个点开始,是以(x1,y1)、(x2,y2)为控制点,(x,y)为终点的三次贝尔塞曲线;

quadraticCurveTo(cx,cy,x,y),意思是从上一个点开始,是以(cx,cy)为控制点,(x,y)为终点的二次贝尔塞曲线。

那么接下来,创建路径之后,我们可以又怎么这几种选择:

使用closePath(),关闭路径,绘制一条连接至起点的线条;

使用fill()、stroke(),对路径进行填充或是描边,前提是设置了(fillStyle、strokeStyle)

使用clip(),创建一个剪切区域

如果我们想在路径关闭之前,判断某个点是否在路径上,可以这样来做

  1. if(context.isPointInPath(,)){
  2. alert("点击这里http://t.cn/RUbL4rP,就可以跳转,快来看看阿!");
  3. }

 绘制文本,有图,就有文本,主要有两个方法,fillText()和strokeText(),传入四个参数,str(字符串)、x坐标、y坐标、最大像素宽度(超过此值,将会自动收缩),当然这两个方法是以以下三个属性(font、textAlign、textBaseline)为基础的,当然要注意,这两个方法也是使用fillStyle和strokeStyle来做填充和描边滴,之后也有demo更新到github上面去!

  1. context.font="blod 14px Arial";
  2. context.textAlign = "center";//"start" "end" "left" "right"
  3. context.textBaseline = "middle";//"top" "bottom" "hanging" "alphabetic" "ideographic"
  4.  
  5. context.fillText("工资低,被迫下海,还望大家多多支持,多多棒槌,宣传一下下",,);

有时候,我们需要将我们的文本控制在某一个区域中的时候,那么会用到measureText()方法,传入一个参数(我们需要显示的字符串),得到的对象里面有个width属性,返回最佳的width,假如说我们现在想在width=150px的画布上显示合适的字体的话,可以这样

  1. var font_size = 40px;
  2. context.font = font_size+''px arial";
  3. while(context.measureText("工资低,被迫下海,还望大家多多支持,多多棒槌,宣传一下下")>600px){
  4. font_size--;
  5. context.font = font_size+''px arial";
  6. }
  7. context.fillText("工资低,被迫下海,还望大家多多支持,多多棒槌,宣传一下下",,);

绘制变换,即是如css3中transform变换,创建绘制上下文时,会以默认值初始化变换矩阵,在默认的变换矩阵中下,所有处理是直接绘制。有如下这些变化:

rotate(angle);//angle是弧度

scale(x1,y1);//放大缩小,在x方向乘以x1,在y方向乘以y1

translate(x,y);//将坐标原点移动到(x,y),好了(x,y)它就变成原点了

transform(m1_1,m1_2,m2_1,m2_2,dx,dy);//直接改变矩阵

setTransform(m1_1,m1_2,m2_1,m2_2,dx,dy);//设置矩阵,对于矩阵详解:http://www.zhangxinxu.com/wordpress/2012/06/css3-transform-matrix-矩阵/

排列方式:,其对应的排列方式是这样的,与transform: matrix(a,b,c,d,e,f);还是不一样滴!

绘制图像,把一副图像绘制到画布上,,可以使用drawImage()方法,可以这样

  1. var image = document.images[]; //获取文档中第一张图像
  2. context.drawImge(image,x,y,width,height,rx,ry,rwidth,rheight);//各个参数分别是:image图像对象,源图像的x坐标、源图像的y坐标,源图像的宽度,源图像的高度,目标图像的x坐标,目标图像的y坐标,目标图像的宽度,目标图像的高度,一般只需要前五个参数,就可以画出一个图像出来了!
  3.  
  4. //可以怎么理解,如context.drawImage(image,0,10,50,50,0,100,40,60);原始图像是以(0,10)为起点,高宽都为50px,但我们想要它实际显示在(0,100),宽40,高60,感觉实际上并没什么用

 阴影,有以下这几个属性:

  1. var context = drawing.getContext('2d');
  2. context.shadowColor = "#000";//阴影颜色
  3. context.shadowOffsetX = ;//阴影x的偏移量
  4. context.shadowOffsetX = ;//阴影y的偏移量
  5. context.shadowBlur = ;//阴影的模糊距离

 渐变,分为线性渐变和径祥渐变,分别是createLinearGradient()和createRadialGradient(),使用如下:

  1. var gradient = context.createLinearGradient(,,,);//创建一个线性渐变区域,矩形区域,要使渐变覆盖整个矩形,需要有时还需要匹配一下坐标
  2.  
  3. gradient.addColorStop(,"white"); //创建色标的开始位置信息
  4.  
  5. gradient.addColorStop(,"black");//创建色标的结束位置信息
  6.  
  7. context.fillStyle= gradient;
  8.  
  9. conetxt.fillRect(,,,);
  10.  
  11. var gradient = context.createRadialGradient(,,,,,);//创建一个径向渐变区域,这里是由两个同心圆组成的,(50,50)为圆的中心点,一个半径为10,一个半径为30,便可以向外扩散,形成径向渐变了
  12.  
  13. gradient.addColorStop(,"white"); //创建色标的开始位置信息
  14.  
  15. gradient.addColorStop(,"black");//创建色标的结束位置信息
  16.  
  17. context.fillStyle= gradient;
  18.  
  19. conetxt.fillRect(,,,);

 模式,意思就是重复的图像来填充画布了,也可以叫做纹理填充,一般使用的方法createPattern,使用如下:

  1. var image = document.images[];
  2.  
  3. var pattern= context.createPattern(image,'repeat');//对应有repeat、repeat-x、repeat-y、no-repeat
  4.  
  5. context.fillStyle = pattern;
  6.  
  7. conetext.fillRect(,,,);

对于canvas绘图的基础就差不多怎么多了,以后还需努力学习,将其用在实际项目上,而对于webGL这种3d上下文就暂时不去学习,这几天看得晕晕的,感觉目前对自己也没什么用处!

canvas绘图基础的更多相关文章

  1. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  2. Canvas绘图基础(一)

    简单图形绘制 矩形:描边与填充 Canvas的API提供了三个方法,分别用于矩形的清除.描边及填充 clearRect(double x, double y, double w, double h) ...

  3. HTML5自学笔记[ 11 ]canvas绘图基础1

    html5新增<canvas>标签用于绘制图像,默认宽高是300*150,canvas的宽高需要在这里设置,在css中设置会有问题:设置的形状,如矩形,会等比缩放,而非设置的宽高. 在不支 ...

  4. canvas绘图基础及基于粒子系统的雪花飘落

    canvas是html中的一个元素,可以通过js操控绘图! 可以绘制各种图形,各种填充样式! 绘制时可以进行旋转,缩放,平移,但并不是很灵活! 有一对比较好用的方法是save restore! sav ...

  5. HTML5 canvas绘图基础(电子名片生成器源码)

    创建canvas <canvas id="myCanvas" class="canvas"> 您的浏览器不支持canvas </canvas& ...

  6. HTML5自学笔记[ 17 ]canvas绘图基础4

    绘制图像: drawImage(oImg,x,y),oImg是一个Image对象,(x,y)为绘制起点,绘制的图像大小和源图大小一样. drawImage(oImg,x,y,w,h),后两个参数设置绘 ...

  7. HTML5自学笔记[ 16 ]canvas绘图基础3

    canvas还提供提供了一些动态方法,使图像可以旋转.缩放和移动,与css3中的方法一样. 移动:translate(x,y),x和y为横竖方向的偏移量 旋转:rotate(弧度),弧度=角度*Mat ...

  8. HTML5自学笔记[ 14 ]canvas绘图基础2

    canvas绘制路径不仅可以绘制直线和多边形,还提供了绘制曲线的方法,利用这些方法可以画出多种曲线效果. 方法1:arc(x,y,r,起始弧度,结束弧度,绘制方向);其中(x,y)为圆心坐标,r为半径 ...

  9. HTML5自学笔记[ 23 ]canvas绘图基础7

    变换矩阵: transform(a,b,c,d,e,f),多次使用该函数,效果是多次状态改变的累加: setTransform(a,b,c,d,e,f),会忽略之前的变换,从起始状态开始改变.

随机推荐

  1. vue项目搭建步骤

    https://blog.csdn.net/echo008/article/details/77099058 https://blog.csdn.net/echo008/article/details ...

  2. node os模块

    const os = require('os'); console.log(os.homedir()); console.log(os.hostname()); console.log(os.plat ...

  3. Kindle:自动追更之云上之旅

    2017年5月27: 原来的程序是批处理+Python脚本+Calibre2的方式,通过设定定时任务的方式,每天自动发动到自己的邮箱中.缺点是要一直开着电脑,又不敢放到服务器上~~ 鉴于最近公司查不关 ...

  4. 日期计算、正则、sequence、索引、表连接、mybatis

    ************************** mybatis ******************************************* #{} 的参数替换是发生在 DBMS 中, ...

  5. dp小总结

    写在前面 Just some easy problem solving with dynamic programming. (Given me a dynamic programming table, ...

  6. Vue 组件&组件之间的通信 之全局组件与局部组件

    在上篇博客中介绍了组件,在注册组件的简写中就用到了全局组件 //注册组件的简写方式 Vue.component('my-componenta',{ template:'<h2>hello ...

  7. MVC输出缓存(OutputCache参数详解)

    版权声明:本文为博主原创文章,未经博主允许转载随意. https://blog.csdn.net/kebi007/article/details/59199115 1.学习之前你应该知道这些 几乎每个 ...

  8. Java调用第三方接口示范

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程[1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的res ...

  9. C# 可指定并行度任务调度器

    可指定并行度的任务调度器 https://social.msdn.microsoft.com/Forums/zh-CN/b02ba3b4-539b-46b7-af6b-a5ca3a61a309/tas ...

  10. Java类的加载时机

    但是对于初始化阶段,虚拟机规范则是严格规定了有且只有5种情况必须立即对类进行“初始化”(而加载.验证.准备自然需要在此之前开始):1)遇到new.getstatic.putstatic或invokes ...