Sapper

2015年08月16日

canvas 学习笔记


基础部分

获取绘图对象

<canvas id=”canvas”></canvas>
var canvas = document.getElementById(‘canvas’);
var context = canvas.getContext(2d’);

状态设置

context.strokeStyle = '#058'; // 边框颜色
context.fillStyle = '#058';      // 填充颜色

context.lineWidth = 10;       // 边框的宽度
context.lineCap = 'butt';     // 线帽,就是线的开头和结尾的形状
// butt    默认
// round   多出半个圆
// square  多出半个正方形

context.lineJoin = 'miter';      // 线拐角的形状
// miter    默认,尖角
// bevel    平角
// round    圆角

context.miterLimit = 10;      // 当lineJoin=’miter’时才有效,用于设置线拐角时内角与外角的最大距离,超过这个大小时lineJoin会变成bevel值

绘制方法

context.stroke();            //绘制边框
context.fill();                //绘制形状

状态控制方法

beginPath()        // 开启一段全新的状态
closePath()        // 把最后一个点与起始点连接起来

context.save()        // 保存前面的状态
context.restore()    // 恢复状态

画直线(线属于边框)

context.moveTo(100, 100);   // 线的起点
context.lineTo(700, 700);   // 线的连接,把前一个点与当前点连接

画矩形

context.fillRect(x, y, width, height);     //实心矩形
context.strokeRect(x, y, width, height);    //空心矩形

画圆

context.arc(x, y, r, start, end, isRever);    // start代表开始的角度,end代表结束的角度,isRever代表是否反回来画,360度为2*Math.PI
context.fill() 或 context.stroke()

画圆弧

从 (x0, y0) 开始到 (x1, y1) 位置画弧线,半径为radius,直到与 (x1, y1) 和(x2, y2)组成的直线相切为止

context.moveTo( x0, y0 );
context.arcTo( x1, y1, x2, y2, radius);
context.stroke();

贝塞尔曲线

// 二次曲线
context.moveTo( x0, y0 );
context.quadraticCurveTo( x1, y1, x2, y2);
context.stroke();

可进入这网站进行调值 http://tinyurl.com/html5quadratic

// 三次曲线
context.moveTo( x0, y0 );
context.bezierCurveTo( x1, y1, x2, y2, x3, y3);
context.stroke();

可进入这网站进行调值 http://tinyurl.com/html5bezier

图像变化

context.translate(x, y)        // 位移
context.rotate(deg)         // 旋转
context.scale(sx, sy)       // 缩放
context.transform(scx, skx, sky, scy, x, y)    // 矩阵变换

scx和scy代表水平和垂直缩放,默认为1 skx和sky代表水平和垂直倾斜,默认为0 x和y代表水平和垂直偏移多少,默认为0

关于fillStyle(strokeStyle同理)

// 线性渐变
var style = context.createLinearGradient(startX, startY, endX, endY); 
// 径向渐变
var style = context.createRadialGradient(startX, startY, r0, endX, endY, r1); 

style.addColorStop(pos, color);  在pos点的颜色是color,上下渐变,pos的取值是0.0 -1.0

//背景图片
var style = createPattern( Images | | Canvas || Video , repeat-style)

context.fillStyle = style;

文字渲染

context.font = ‘bold 40px Arial’; 

[ font-style ] [font-variant] [font-weight] [ font-size ] [ font-family ]

  • font-style:normal(默认) italic 斜体字 oblique 倾斜字体

  • font-variant:normal(默认) small-caps 小型大写字母

  • font-weight:normal(默认) lighter 更小 bold 粗体 bolder更粗

      现在的web对于normal和lighter样子是一样,bold和bolder一样
  • font-size:px(默认) em %

  • context.textAlign = left | center | right;

  • context.textBaseline = top | middle | bottom | alphabetic(默认) | ideographic | hanging;

    • alphabetic 是基于英文为基准线
    • ideographic 是基于汉语为基准线
    • hanging 基于印度语为基准线
var fontWidth = context.measureText( text ).width; // 获得text字符串所占的宽度

context.fillText(text, x, y[, maxWidth]);

阴影

context.shadowColor = ‘#ccc’;   // 阴影颜色
context.shadowOffsetX = 20;     // X轴偏移量
context.shadowOffsetY = 20;     // Y轴偏移量
context.shadowBlur = 5;         // 模糊度

全局设置

context.globalAlpha = 0.5         全局设置透明度

context.gloabalCompositeOperation = ‘source-over’    全局设置图与图之间的遮盖方式
  • source-over 后绘制的遮盖前面绘制的
  • source-atop 后绘制的未遮盖部分被剪切
  • source-in 只显示后绘制的图像,未遮盖部分被剪切
  • source-out 只显示后绘制的图像,遮盖部分被剪切
  • destination-over 跟source相反,把后绘制的改成前面绘制的
  • destination-atop
  • destination-in
  • destination-out
  • lighter 后绘制跟前面绘制的重叠部分进行颜色重新计算
  • copy 只显示后绘制的
  • xor 后绘制跟前面绘制的重叠部分被挖空

剪切区域

context.arc(0, 0, 30, 0, 2*Math.PI);
context.clip();

后面绘制的东西只会在这个圆形范围里面显示

交互

context.clearRect(startX, startY, endX, endY); // 清空画布指定范围
context.isPointInPath( x, y ); // 判断(x , y)位置是否有绘制东西
canvas.getBoundingClientRect().left    // 获取画布距离浏览器左边的距离

绘制图像

context.drawImage( image, x, y); 
context.drawImage( image, x, y, w, h);
context.drawImage( image, sx, sy, sw, sh, dx, dy, dw, dh);    s开头是操作源图像

context.getImageData(0, 0, w, h); // 获取画布数据,属性data存着画布所有的像素点信息,是一个数组,数组长度为宽度*高度*4,其中这个4指rgba各个值

context.putImageData( imageData, dx, dy, dirtyX, dirtyY, w, h ); // 将数据导入画布

context.createImageData(w, h);    // 新建一个空白画布

Maxi Ferreira

你好!我是诀死行者,一个专注于研究诀死 (JS) 功法的修行者。很高兴在修行的路上有你的陪伴, 你可以到 GitHub 观摩我的修行成果, 也可以到我的网站查阅我的修行笔记。