Canvas 绘图基础与深入

一.Canvas绘图基础

什么是:
Canvas是在HTML5中新增的标签用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap)。

大多数 Canvas 绘图 API 都没有定义在 canvas 元素本身上,
而是定义在通过画布的getContext() 方法获得的一个“绘图环境”对象上。
绘制时一定要在context绘图环境下绘制   *canvas是基于状态的绘制 把状态和绘制分开

1.HTML
<canvas id="canvas"></canvas>

2.JavaScript

设置绘图环境
var canvas = document.getElementById('canvas')
var context = canvas.getContext("2d")
使用context绘制  先设置起始点,终点和各种状态,再进行绘制
1.canvas的API
  1.canvas.width   canvas.height   canvas.getContext("2d") 
    设置绘图上下文环境
  2.context.moveTo(x,y)
    定义绘图起始点与节点   
  3.context.lineTo(x,y)
    定义绘图结束点
  4.context.arc(cx, cy, r, sAng, eAng, anticlock = false )  
    绘制圆或圆弧  圆心x轴坐标, 圆心y轴坐标, 半径, 起始点, 结束点, 绘制方向
  5.context.beginPath() 
    开始一段 新的 绘图   
  6.context.closePath()  
    结束一段绘制
  7.context.lineWidth 
    指定线条宽度
  8.context.strokeStyle = "rgba(12, 12, 3, .5)"   
    指定线条颜色
  9.context.fillStyle = "color"  
    设置填充颜色
  10.context.stroke()
    怎么用: stroke() 方法会实际地绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色
  11.context.fill()  
    对某个封闭图形进行填充
  12.context.clearRect(x,y, width, height)  
    x轴点, y轴点, 宽度, 高度  刷新当前画布上指定矩形区域内的图形

2.使用JS定时器进行动画
  setInterval(
    function(){
      render();  //进行渲染
      update();  //进行底层数据刷新
    },50)

二.canvas绘图详解
1.绘制封闭多边形 将多段线条放入beginPath() 和 closePath()

问题: 填充颜色时,会覆盖掉一半的边框
解决: 将颜色填充放到绘制线条前

2.rect函数

context.rect(x, y, width, height)  
  绘制一个矩形的边框路径
context.fillRect(x, y, width, height)
  绘制填充矩形
context.strokeRect(x, y, width, height)
  绘制一个带有边框的矩形

3.lineCap

线条属性,只能用于开头结尾,不能用于连接处 
  butt(默认值) round(圆头) square(方头)

4.lineJoin

设置线条连接处的样式
miter(默认值,尖头)   bevel(斜角)   round(圆角) 
①miterLimit 只能用于miter,

5.状态保存

save() 
  保存之前的绘图状态
context.restore()
  返回之前context.save()保存的绘图状态

6.图形变换

translate(x,y)  位移   
  在位移后需要再移动回去 translate(-x, -y)
  解决用状态保存
rotate(deg)     旋转
scale(x,y)      缩放
  会对其他属性如 边框, 起始位置 等也会产生缩放

7.变换矩阵

 a c e    a 水平缩放(1) b 水平倾斜(0)  c 垂直倾斜(0)
 b d f    d 垂直缩放(1) e 水平位移(0)  f 垂直位移(0)
 0 0 1
transfrom(a, b, c, d, e, f)
  transfrom可以多个进行级联
setTransform(a, b, c, d, e, f)
  忽略掉以前所有的transform,将变换矩阵重置为单位矩阵,再传入数据

8.填充样式

fillStyle 线性渐变
  1.设置线性渐变填充色
    ① var linearGrd = context.createLinearGradient(xstart, ystart, xend, xend)  //设置起点 与 终点
    ② linearGrd.addColorStop(stop, color)  //设置终点 与 颜色
    填充颜色
      context.fillStyle = linearGrd
  2.设置径向渐变
                                           //设置两个圆的圆心和半径
    ① var grd = context.createRadialGradient(x0, y0, r0, x1, y1, r1)  
    ② grd.addColorStop(stop, color)
  3.设置图片填充
    createPattern(img/canvas/video, repeat-style)  
    no-repeat 不重复  repeat-x 横向重复  repeat-y 纵向重复  repeat 重复
    图片填充通常是为了表现一种纹理或背景
    还可以用视频作为背景填充
    使用: 
      var backgroundImage = new Image()
      background.src = "url"
      var pattern = context.createPattern(backgroundImage, "no-repeat")
      context.fillStyle = pattern
      context.fillRect(0,0,800,800)

9.曲线绘制

arcTo()
先用moveTo创建开始点
再用acrTo(x1, y1, x2, y2, radius) 绘制一条圆弧
从(x1,y1) 与 (x2, y2)形成一个直角 radius是半径
半径与直角有两个相切点,两个切点形成一条圆弧

10.贝塞尔二次曲线

使用: moveTo(x0, y0)创建开始点
      quadraticCurveTo(x1, y1, x2, y2) 指定控制点 和 结束点

11.贝塞尔三次曲线

使用:
  moveTo(x0, y0) 移动到起始点
  bezierCurveTo(x1, y2, x2, y2, x3, y3) 两个控制点 一个结束点

三.文字渲染基础
1.设置字体样式

font 默认值 '20px sans-serif'
font-style: normal italic(斜体) oblique(倾斜字体) 
font-variant: normal small-caps(小型大写字母)
font-weight: lighter(更细)  normal bold bolder(更粗) 100~900
font-size: 20px默认  xx-small x-small medium large x-large xx-large
font-family: 设置多种字体备选  支持@font-face(向浏览器注入新字体) web安全字体

2.开始绘制文字

    fillText(string, x, y,[maxlen])     maxlen 指文本行最大宽度

3.绘制一行只有边框的文字

    strokeText(string, x, y, [maxlen])
    可以用渐变 图片填充等设置文字颜色

4.基于起始点调整文本水平位置

    textAlign
    left  center right

5.基于中间线调整文本垂直位置

textBaseline
top middle bottom alphabetic默认值(基于拉丁语的基准线) ideographic(基于中文,日文等方块字) hanging(基于印度文字)

6.文本的度量

    measureText(string).Width
    传入字符串,返回一个对象,计算字符串的渲染宽度

四.高级canvas
1.阴影

shadowColor
阴影颜色
shadowOffsetX
shadowOffsetY
阴影位移值
shadowBlur
阴影模糊值

2.全局透明度

    globalAlpha = 1(default)

3.设置遮挡效果

globalCompositeOperation
source-over 默认值 后绘制的压在先绘制的图形上
destination-over 先绘制的压再后绘制的图形上
destination-over 在源图像上方显示目标图像。
源图像 先绘制的 目标图像 后绘制的
source-atop 在目标图像顶部显示源图像。源图像位于目标图像之外的部分是不可见的。
source-in 在目标图像中显示源图像。只有目标图像内的源图像部分会显示,目标图像是透明的。
source-out 在目标图像之外显示源图像。只会显示目标图像之外源图像部分,目标图像是透明的。

destination-atop    在源图像顶部显示目标图像。源图像之外的目标图像部分不会被显示
destination-in  在源图像中显示目标图像。只有源图像内的目标图像部分会被显示,源图像是透明的。
destination-out 在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。
lighter 显示源图像 + 目标图像。
copy    显示源图像。忽略目标图像。
xor     使用异或操作对源图像与目标图像进行组合。

4.剪辑区域

clip()
使用clip()规划任意路径,再用stroke()绘制,之后所有绘制都会限制到这个区域

5.非零环绕原则

判断图形内外侧
从一块区域向外引一条射线,图形路径为顺时针+1,逆时针-1,为0则在外面,不为0,在里面
规划路径通过相反路径,来做剪纸,镂空等效果

6.对指定矩形区域进行清空

 clearRect(x, y, width, height)

7.为元素添加事件

   canvas.addEventListener("mousemove", detect)

8.获取鼠标位置

    var x = event.clientX - canvas.getBoundingClientRect().left;
    var y = event.clientY - canvas.getBoundingClientRect().top;

9.判断鼠标传入位置

  isPointInPath()方法返回 如果指定的点位于当前路径中true,否则返回 false
  isPointInPath(x, y)

10.HTML与canvas

html不能放在canvavs中
canvas不是透明的,是白色的

11.canvas的原型对象

CanvasRenderingContext2D
制作自己的绘图函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值