canvas基础用法

canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现.

  非零环绕原则:
    如果需要判断某一个区域是否需要填充颜色. 就从该区域中随机的选取一个点.
    从这个点拉一条直线出来, 一定要拉到图形的外面. 此时以该点为圆心.
    看穿过拉出的直线的线段. 如果是顺时针方向就记为 +1, 如果是 逆时针方向,
    就记为 -1. 最终看求和的结果. 如果是 0 就不填充. 如果是 非零 就填充.

       

首先给 canvas设置宽高不能再样式表里设置,只能在行内中设置,这样就不会失真,默认宽高是300,150

  ctx.moveTo :(x , y): 将绘制的起始点设置为x ,y
  ctx.lineTo : (x , y):从当前位置
  ctx.stroke():描边绘图,将坐标点连起来;
  ctx.fill():调用fill方法会将所有的点连接起来,并构成一个封闭的图形结构,如果所有的描点没有构成封闭结构,也会将开始的起点,与最终的点连接起来,构成一个闭合 的图形,并填充颜色,默认黑色;
  ctx.beginPath():开启新路径;
  closePath( ):闭合路径;
  ctx.strokeStyle= : 设置边框颜色;
  ctx.fillStyle=:设置填充颜色;
  ctx.lineWidth=:设置线宽;
  ctx.lineCap=:设置线 末端 以什么类型结束; butt(两端使用方形结束) round(两端末端添加圆形线帽) square (两端末端添加正方形线帽)
  ctx . lineJoin=:设置相交线的拐点; 'round' 使用圆角连接. bevel' 使用平切连接. 'miter' 使用直角转.

虚线:
  lineDashOffset = : 用于设置开始绘制虚线的偏移量. 数字的正负表示左右偏移;
  getLineDash( ) :获取实虚线数组;
  setLineDash([ 5, 5 ] ) : 设置实线长度为5,虚线长度为5;

绘制矩形:
  Ctx . rect ( x , y , width , height ) : 只是描边,必须要配合stroke()/ fill( ) 使用;
  Ctx . strokeRect (x , y , width , height) : 直接绘制正方形;
  Ctx . fillRect (x , y , width , height) : 绘制正方形并且填充默认黑色;
  Ctx . clearRect(x , y , width , height): 清除绘制的矩形;

清除画布:
  Ctx . clearRect ( 0 , 0 , cas . width , cas . height ) :从画布圆点开始,以画布的高和宽进行清除;
  Cas . width = cas . width : 重新设置画布的宽,相当于画布被刷新了一次,也就被清空;

圆弧:
  ctx . arc(x , y , r , startAngle . endAngle , anticlockwise) 6个参数,前五必填;
      x , y 是圆心坐标;
       radius 表示圆弧半径, 单位为弧度;
      startAngle 与 endAngle 表示开始到结束的角度,从 x 正轴为 0°, 顺时针为正方向 .
      anticlockwise (方向正反):表示是否采用默认的正向角度, 如果传入 true 表示逆指针为正 . 该参数可选.


弧度制:
  为了更好的计算角度,我们把角度提供一个新的定义,用 PI (π)作为单位,将单位圆的一个整圈(360度)记作 2 倍的 PI;
这样的度量表示就是弧度制的表示方法;
  angel 角度;
  radian 弧度 ;


角度转换为弧度:
  弧度 = 角度 / 180 * π π =180度 弧度 = 60度 / 180度 * π ;


弧度转换为角度 :
  角度 = 弧度 * 180 / π 角度 =(π / 3) * 180 / π ;

 

 

计算圆弧上的点的坐标:
  x = x0 + r * Math . cos(a); x0为圆心x
  y = y0 + r * Math . sin(a); y0为圆心y

 

绘制文本:
  Ctx . fillText ( " 文字内容 ",x , y ) : 实心文字; x,y为文本的起始点坐标,但是是以文字的左下角为起始点坐标;
  Ctx . strokeText (“ 文本内容 ”, x , y): 描边文字,镂空的文字; x,y为文本的起始点坐标,但是是以文字的左下角为起始点坐标;
  Ctx . font():设置绘制字体的各种信息, 与 CSS 语法一致 , 设置字体形状 , 样式 , 字号粗细等 style | variant | weight | size/line-height | family.


文字对齐属性:
  ctx . textAlign = : 水平对齐; left( 默认start ) / right(end) / center ; 以左下角的点为竖线,水平向左 / 右 / 中间对齐;
  Ctx . textBaseline = : 垂直对齐; bottom(默认) / middle(英文四条线上的第二条线) / top(悬挂在基线下) ; 以左下角的点为横线, 垂直向上 / 中 / 下对齐;

   /alphabetic 表示字母参考线, ideographic 会比它低一点, hanging 表示悬挂. [ 对齐方式:可不记 ]


绘制图片:
  [ 绘制图片要等待图片获取到了之后再绘制,img.onload=function( ) { ctx.drawImage ( img, x , y ) } ]
    ctx . drawImage ( img, x , y ) : 将图片绘制到x, y表示的位置去;
    ctx . drawImage ( img, x , y, width , height ) : 将图片绘制到指定的矩形里去;
    Ctx . drawImage ( img , sx , sy , sWidth , sHeight , dx , dy , dWidth , dHeight ):
    这里的带有 s 前缀的参数就是指图源的矩形区域,将图片的 ( 100, 100, 300, 200 ) 处的内容绘制到页面的 ( 100, 100, 300, 200 ) 的位置.

变换:
  Ctx . scale ( ) : 该方法实现水平与垂直的缩放.
        参数 x 控制水平缩放倍率. 传参 1 表示不作缩放, 传入大于 1 的数字表示扩大.
        参数 y 控制垂直缩放倍率. 传参 1 表示不作缩放, 传入大于 1 的数字表示扩大;

  Ctx . translate( ) : 平移变换就是将原有坐标轴进行平行移动, 那么坐标轴移动后就可以使用新坐标来绘制图形了.

  Ctx . rotate( radian ) : 该方法将坐标轴进行旋转变换.
         参数是弧度, 表示旋转的方式. 正数表示顺时针旋转, 负数表示逆时针旋转.

canvas状态:
  Ctx . save(): 保存状态,将画的状态封起来;
  Ctx.restore() : 恢复成开始的状态,也就是再次beginPath( )开始之后,不会继承上一次的图形属性效果;
  两者要配合头尾使用,才能避免继承的问题;

Konva:
使用Konva的步骤
  1.需要引入Konva库
  2.在页面中放置一个div作为舞台的容器(需要设置id属性)
  3.使用Konva创建舞台
    在Konva中Konva这个名字是一个命名空间,所有的构造函数都是它的成员
    例: var stage = new Konva . Stage(); Stage就是Konva的构造函数成员
  4.创建舞台使用Konva.Stage
    参数必须有width, height, container

Stage : 舞台, 类似html
  var stage =new Konva . Stage({
    width : 600,       宽为600,高为400的舞台
    height : 400,
    container: 'dv'    容器为div
  });


Layer : 层,类似body, 舞台中要有层; var layer = new Konva . Layer ();


Rect : 矩形 var rect = new Konva . Rect({ 正方形的属性 }); 类似div

add () : stage . add( Layer ) / layer . add ( rect ) 必须把层放在舞台上, 再把元素放在层里,就可以渲染出来;
    注意点: 先创建舞台,再创建层,再绘制图形,再将图形添加到层中,再将层添加到舞台中,千万不能还没绘制图形,就先把层添加到舞台上,而再去绘制图形,不然添加的是个空图层;

控制台里获取x.y的坐标值: Element.x( ) Element.y( ) ;

 

posted @ 2017-12-29 11:46  FishJ  阅读(502)  评论(0编辑  收藏  举报