canvas

canvas

我在之前已经看过一段时间canvas的api了,现在先将api重新过亿遍。
然后根据文档中不理解的东西,具体的在去学习。

绘制

canvas 基本用法

  
  var cvs = document.getElementById('#canvas')

  // 检查浏览器是否支持
  if(cvs.getContext){
    var ctx = cvs.getContext('2d')
  }else{
    return
  }

绘制形状


  // 绘制填充矩形
  ctx.fillRect(x,y,w,h);

  // 绘制镂空矩形
  ctx.strokeRect(x,y,w,h);

  // 清除指定区域
  ctx.clearRect(x,y,w,h);

绘制路径


  // 开始一条路径的绘制
  ctx.beginPath();

  // 结束一条路径的绘制
  ctx.closePath();

  // 绘制镂空路径
  ctx.stroke();

  // 绘制填充路径 
  // 后面才发现这个api 还有一个模式的选择
  // model: nonzero / evenodd
  ctx.fill(model);

  // 从当前坐标点开始绘制路径
  ctx.moveTo(x,y)

  // 从上一个坐标点绘制到目标坐标点
  ctx.lineTo(x,y)

绘制文本

绘制文本的api


  // 最后一个参数通常省略
  ctx.fillText(text,x,y,maxwidth)
  ctx.strokeText(text,x,y,maxwidth)
  
  // 类似于css
  ctx.textAlign = ''
  // ltr, rtl, inherit
  ctx.direction = ''
  // top, hanging, middle, alphabetic, ideographic, bottom
  ctx.textBaseline =''

  measureText

  // 测量文本的宽度
  
  var text = ctx.measureText("foo"); // TextMetrics object
  text.width; // 16;

绘制圆弧


  // 画一个以(x,y)为圆心的以radius为半径的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成。
  ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise)

  // 根据给定的控制点和半径画一段圆弧,再以直线连接两个控制点。
  ctx.arcTo(x1, y1, x2, y2, radius)

  // 注意:arc()函数中表示角的单位是弧度,不是角度。角度与弧度的js表达式:

  弧度=(Math.PI/180)*角度。

  // 如何获取圆上的坐标点?
  sinθ = y/r
  cosθ = x/r
  x = cosθ*r = Math.cos(180*i/Math.PI)*r
  y = sinθ*r = Math.sin(180*i/Math.PI)*r

绘制线型


  // 绘制线的宽度
  ctx.lineWidth = 3

  // 绘制线的末端样式 (butt,round 和 square。默认是 butt。)
  ctx.lineCap = 'butt'

  // 设定线条与线条间接合处的样式 (round, bevel 和 miter。默认是 miter。)
  lineJoin = 'miter' 
  
  // 限制当两条线相交时交接处最大长度;所谓交接处长度(斜接长度)是指线条交接处内角顶点到外角顶点的长度。
  miterLimit = value

  // 返回一个包含当前虚线样式,长度为非负偶数的数组。
  ctx.getLineDash()

  // 设置当前虚线样式。setLineDash 方法接受一个数组
  ctx.setLineDash(segments)

  // 设置虚线样式的起始偏移量。
  ctx.lineDashOffset = value

  用 setLineDash 方法和 lineDashOffset 属性来制定虚线样式. setLineDash 方法接受一个数组,来指定线段与间隙的交替;lineDashOffset 属性设置起始偏移量.

  var ctx = document.getElementById('canvas').getContext('2d');
  var offset = 0;

  function draw() {
    ctx.clearRect(0,0, canvas.width, canvas.height);
    ctx.setLineDash([4, 2]);
    ctx.lineDashOffset = -offset;
    ctx.strokeRect(10,10, 100, 100);
  }

  function march() {
    offset++;
    if (offset > 16) {
      offset = 0;
    }
    draw();
    setTimeout(march, 20);
  }

  march();

二次贝塞尔曲线及三次贝塞尔曲线

感觉贝塞尔曲线涉及到的东西尤其的多,点线面的许许多多的知识。之后再去学习,咋们继续往下翻文档。


// 绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点
ctx.quadraticCurveTo(cp1x, cp1y, x, y) 

// 绘制三次贝塞尔曲线,cp1x,cp1y为控制点一,cp2x,cp2y为控制点二,x,y为结束点
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

使用样式和颜色


  // 绘制填充图形的颜色
  ctx.fillStyle = 'red'
  // 绘制镂图形的颜色
  ctx.strockStyle = 'red'
  // 设置全局透明度
  globalAlpha = '0.5'
  

绘制渐变

这个api类似于 css3的线性渐变、径向渐变。

通过 createLinearGradient / createRadialGradient 创建 线性渐变、径向渐变

然后通过addColorStop 添加渐变的颜色

最后通过 给fillStyle 和 strokeStyle 赋值。

看具体的代码


  ctx.createLinearGradient(x,y,x1,y1)

  var gradient = ctx.createLinearGradient(0,0,2,2) 
  ctx.gradient.addColorStop(0,'red')
  ctx.gradient.addColorStop(1,'#fff')
  //赋值给style 
  ctx.fillStyle = geadient;

图案样式

就是用图片绘制你想要的图形。


function draw() {

  // createPattern()

  var ctx = document.getElementById('canvas').getContext('2d');

  // 创建新 image 对象,用作图案
  var img = new Image();
  img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png';
  img.onload = function() {

    // 创建图案
    var ptrn = ctx.createPattern(img, 'repeat');
    ctx.fillStyle = ptrn;
    ctx.fillRect(0, 0, 150, 150);

  }
}

阴影 Shadows

就目前的了解来看canvas的shadows 值只针对于文字的。


  ctx.shadowsOffsetX  // X轴上偏移的值
  ctx.shadowsOffsetY  // Y轴上偏移的值
  ctx.shadowBulr // 模糊的值
  ctx.shadowColr // 颜色

  ctx.shadowOffsetX = 2;
  ctx.shadowOffsetY = 2;
  ctx.shadowBlur = 2;
  ctx.shadowColor = "rgba(0, 0, 0, 0.5)";

  ctx.font = "20px Times New Roman";
  ctx.fillStyle = "Black";
  ctx.fillText("Sample String", 5, 30);

保存状态(save) 弹出状态(restore)

canvas.save();与canvas.restore();

一般结合使用,.save()函数在前,.restore()函数在后,

用来保证在这两个函数之间所做的操作不会对原来在canvas上所画图形产生影响。

对canvas中特定元素的旋转平移等操作实际上是对整个画布进行了操作,所以如果不对canvas进行save以及restore,那么每一次绘图都会在上一次的基础上进行操作,最后导致错位。

比如说你相对于起始点每次30度递增旋转,30,60,90.如果不使用save 以及 restore 就会变成30, 90, 150,每一次在前一次基础上进行了旋转。

save 再函数之前 restore在函数之后.

怎么解释看

官网解释

形变


  // 旋转
  ctx.rotate(radians)
  注意:角度以弧度表示,而不是度数。要转换,我们使用:radians = (Math.PI/180)*degrees。


  // 移动
  ctx.translate(x,y)
  // 在网格上移动画布及其原点。x指示要移动的水平距离,并y指示垂直移动网格的距离。 

  // 缩放 x y 表示在 水平垂直 上缩小多少  1 为正常值
  ctx.scale(x,y)

  // 变换
  ctx.transform() 和 ctx.setTransform() 要配合使用

  ctx.transform(a,b,c,d,e,f)
  // 将当前变换重置为单位矩阵,然后transform()使用相同的参数调用该方法。这基本上会撤消当前的转换,然后设置指定的转换,一步完成。

  a (m11)
  水平缩放。
  b (m12)
  水平倾斜。
  c (m21)
  垂直倾斜。
  d (m22)
  垂直缩放。
  e (dx)
  水平移动。
  f (dy)
  垂直移动。
  
  
  ctx.setTransform() 
  
  将当前变换重置为单位矩阵。这与调用相同:ctx.setTransform(1, 0, 0, 1, 0, 0);
  

合成 裁剪

  
  globalCompositeOperation = type

  ctx.clip();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值