美文网首页
HTML5_Canvas

HTML5_Canvas

作者: 小懒豆 | 来源:发表于2018-04-19 13:41 被阅读17次

    1. 创建Canvas

    //HTML
    <canvas id="myCanvas" width="400" height="200">
      您的浏览器不支持canvas!
    </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

          本文链接:https://www.haomeiwen.com/subject/mhgfkftx.html