HTML5_Canvas

1. 创建Canvas

//HTML

  您的浏览器不支持canvas!

//JavaScript
var canvas = document.getElementById('myCanvas');

if (canvas.getContext) {
  var ctx = canvas.getContext('2d');
}

2. API

颜色、样式和阴影

fillStyle:设置或返回用于填充绘画的颜色、渐变或模式
strokeStyle:设置或返回用于笔触的颜色、渐变或模式
shadowColor:设置或返回用于阴影的颜色
shadowBlur: 设置或返回用于阴影的模糊级别
shadowOffsetX:设置或返回阴影距形状的水平距离
shadowOffsetY:设置或返回阴影距形状的垂直距离
createLinearGradient():创建线性渐变(用在画布内容上)
createPattern(): 在指定的方向上重复指定的元素
createRadialGradient():创建放射状/环形的渐变(用在画布内容上)
addColorStop(): 规定渐变对象中的颜色和停止位置

线条样式

lineCap:设置或返回线条的结束端点样式
lineJoin:设置或返回两条线相交时,所创建的拐角类型
lineWidth:设置或返回当前的线条宽度
miterLimit:设置或返回最大斜接长度

矩形

rect(x, y, width, height): 创建矩形
fillRect(x, y, width, height): 绘制“被填充”的矩形
strokeRect(x, y, width, height): 绘制矩形(无填充)
clearRect(x, y, width, height): 在给定的矩形内清除指定的像素

路径

fill():填充当前绘图(路径)
stroke():绘制已定义的路径
beginPath():起始一条路径,或重置当前路径
moveTo(x,y):把路径移动到画布中的指定点,不创建线条
closePath():创建从当前点回到起始点的路径
lineTo():添加一个新点,然后在画布中创建从该点到最后指定点的线条
clip():从原始画布剪切任意形状和尺寸的区域

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
// 剪切矩形区域
ctx.rect(50,20,200,120);
ctx.stroke();
ctx.clip();
// 在 clip() 之后绘制绿色矩形,只能显示出部分
ctx.fillStyle="green";
ctx.fillRect(0,0,150,100);

quadraticCurveTo(控制点的 x ,控制点的 y ,结束点的 x ,结束点的 y ): 创建二次贝塞尔曲线
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y): 创建三次方贝塞尔曲线
arc(x, y, radius, startAngle, endAngle, anticlockwise): 创建弧/曲线(用于创建圆形或部分圆)
arcTo(): 创建两切线之间的弧/曲线
isPointInPath(): 如果指定的点位于当前路径中,则返回 true,否则返回 false

转换

scale(): 缩放当前绘图至更大或更小
rotate(): 旋转当前绘图
translate(): 重新映射画布上的 (0,0) 位置
transform(): 替换绘图的当前转换矩阵
setTransform(): 将当前转换重置为单位矩阵。然后运行 transform()

文本

fontctx.font = "Bold 20px Arial"
textAlign: 对齐方式
textBaseline
fillText(string, x, y): 在画布上绘制“被填充的”文本 ,fillText方法不支持文本断行,即所有文本出现在一行内
strokeText(): 在画布上绘制文本(无填充)
measureText(): 返回包含指定文本宽度的对象

图像绘制

drawImage(): 向画布上绘制图像、画布或视频

像素操作

width: ImageData 对象的宽度
height: ImageData 对象的高度
data: ImageData 对象的图像数据
createImageData(): 创建新的、空白的 ImageData 对象
getImageData(): 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据
putImageData(): 把图像数据(从指定的 ImageData 对象)放回画布上

合成

globalAlpha: alpha 或透明值
globalCompositeOperation

其他

save():保存当前环境的状态
restore():返回之前保存过的路径状态和属性
createEvent()
getContext()
toDataURL()

3. 离屏canvas进行预渲染

用离屏canvas进行预渲染了,原理很简单,就是先绘制到一个离屏canvas中,然后再通过drawImage把离屏canvas画到主canvas中

一般例子

ctx.save();
    var j = 0;
    ctx.lineWidth = borderWidth;
    for (var i = 1; i < this.r; i += borderWidth) {
        ctx.beginPath();
        ctx.strokeStyle = this.color[j];
        ctx.arc(this.x, this.y, i, 0, 2 * Math.PI);
        ctx.stroke();
        j++;
    }
    ctx.restore();

4. 示例

画尺子

//canvas宽高为900
    let canvas = document.getElementById('c')
    let ctx = canvas.getContext('2d');
    //画尺子主体
    ctx.lineWidth = 3;
    ctx.beginPath();
    ctx.moveTo(48, 400);
    ctx.lineTo(652, 400);
    ctx.strokeStyle = "#666";
    ctx.stroke();
    //每厘米间隔像素
    var rate = 10;
    //循环画出刻度线
    for (var i = 0; i < 61; i++) {
        ctx.beginPath();
        ctx.moveTo(50 + rate * i, 400);

        if (i % 5 == 0 && i % 10 != 0 && i != 0) {
            //中间5刻度
            ctx.lineWidth = 2;
            ctx.fillText(i, 45 + rate * i, 420);
            ctx.lineTo(50 + rate * i, 380);
        } else if (i % 10 == 0) {
            //中间10刻度
            ctx.lineWidth = 4;
            ctx.fillText(i, 45 + rate * i, 420);
            ctx.lineTo(50 + rate * i, 375);
        } else {
            ctx.lineWidth = 1;
            ctx.lineTo(50 + rate * i, 385);
        }
        ctx.stroke();
    }

画时钟

 let canvas = document.getElementById('c')
    let ctx = canvas.getContext('2d');
    ctx.translate(400, 400)
    ctx.lineWidth = 1;
    ctx.strokeStyle = "#666";
    //圆圈
    ctx.beginPath();
    ctx.arc(0, 0, 110, 0, 2 * Math.PI);
    ctx.stroke();
    ctx.closePath()

    //刻度盘
    ctx.save()
    for (var i = 0; i < 60; i++) {
        ctx.lineWidth = 1;
        ctx.beginPath();
        if (i % 5 == 0) {
            ctx.lineWidth = 3;
            ctx.moveTo(0, 95);
        } else {
            ctx.moveTo(0, 100);
        }
        ctx.lineTo(0, 110);
        ctx.stroke();
        ctx.rotate(6 * Math.PI / 180);
    }
    ctx.restore()

    /** 
     * @Author: xujianwei 
     * @Date: 2018-04-14 09:45:08 
     * @Desc:  画指针的函数
     * @params:  ctx--canvas对象
     * @params:  rotate--旋转角度系数
     * @params:  length--指针长度
     * @params:  color--指针颜色
     */
    function pointer(ctx, rotate, length, color) {
        ctx.save()
        ctx.beginPath();
        ctx.rotate(rotate * Math.PI / 30);
        ctx.moveTo(0, -10);
        ctx.lineTo(0, length);
        ctx.strokeStyle = color
        ctx.lineWidth = 3;
        ctx.stroke();
        ctx.closePath()
        ctx.restore()
    }
    //使画布的起始点旋转到钟表的12点刻度
    ctx.rotate(Math.PI);
    setInterval(function () {
        //清理现场
        ctx.beginPath();
        ctx.arc(0, 0, 85, 0, 2 * Math.PI);
        ctx.fillStyle = '#fff'
        ctx.fill()
        ctx.closePath()
        //清理完毕
        var date = new Date()
        pointer(ctx, date.getSeconds(), 80, '#ff4d4d')
        pointer(ctx, date.getSeconds() / 60 + date.getMinutes(), 80, '#333')
        pointer(ctx, date.getSeconds() / 720 + date.getMinutes() / 12 + date.getHours() * 5, 30, '#333')

        //添加中间原点
        ctx.beginPath();
        ctx.arc(0, 0, 4, 0, 2 * Math.PI);
        ctx.fillStyle = '#ff4d4d'
        ctx.fill()
        ctx.closePath()
    }, 1000)
 

你可能感兴趣的:(HTML5_Canvas)