zoukankan      html  css  js  c++  java
  • canvas学习与应用

       作为一名有格调的前端工程师(页面切图仔。。),这年头要是不懂得canvas是神马玩意,那可就真的low了。

       于是,抱着自我反省的态度,我要来学习一下canvas这个好玩的绘图工具。

       canvas的默认宽度是300px,默认高度是150px。这是不对canvas设置宽高时的默认显示宽高。

       一:canvas的API

        canvas在页面内容上只是一个标签,    

    <canvas id="canvas">你的浏览器不支持canvas!</canvas>

        当然,可以直接在标签中设置canvas画布的宽高属性,也可以在js中规定宽高。    

    <canvas id="canvas" width="600" height="400">你的浏览器不支持canvas!</canvas>

        对于canvas的样式最好交给css来处理,比如:

    #canvas{
        display:block;  //只有加上block,下面的居中才会有反应,说明canvas不是块级元素
        margin:0 auto;
        border:1px solid #aaa;
    }

        OK,下面就要用js来操作canvas了,首先获取canvas对象(画布),然后获取对应的画笔对象canvas.getContext('2d');

    var canvas = document.getElementById('canvas');   //获取canvas对象(画布)
    var ctx = canvas.getContext('2d');  //获取对应的画笔对象

      canvas.width = 800;  //定义画布宽度
      canvas.height = 600; //定义画布高度

        canvas元素绘制图像的时候有两种方法,分别是

        ctx.fill()//填充

        ctx.stroke()//绘制边框

       

        style:在进行图形绘制前,要设置好绘图的样式

        ctx.fillStyle//填充的样式

        ctx.strokeStyle//边框样式   

        ctx.lineWidth//图形边框宽度 

        

        颜色的表示方式:

             直接用颜色名称:"red" "green" "blue"

             十六进制颜色值: "#EEEEFF"

             rgb(1-255,1-255,1-255)

             rgba(1-255,1-255,1-255,透明度)

         和GDI是如此的相像,所以用过GDI的朋友应该很快就能上手 

         二:绘制直线

    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    
    canvas.width = 300;
    canvas.height = 150;
    
    ctx.strokeStyle = '#aaa';
    ctx.lineWidth = 10;
    ctx.lineCap = 'square';
    
    ctx.beginPath();
    ctx.moveTo(5,5);  //起点
    ctx.lineTo(200,100);  //终点
    ctx.stroke();
    ctx.closePath();

    (1)每个canvas上下文仅有一个当前Path

    (2)通过beginPath方法开启一个Path,closePath方法来结束一个Path

    (3)Path有两个基本的方法moveTo()和lineTo()

    (4)lineCap有三个属性:butt(默认)边缘是平的,与当前线条垂直;round:边缘是半圆,该半圆的直径是当前线条的长度;square:边缘是长方形,该长方形的长是当前线条的宽度,宽是当前线条宽度的一半;

    (5)lineWidth属性用来设置线条的宽度

    (6)strokeStyle属性用来定义当前线条的颜色及样式

    var canvas = document.getElementById('canvas');   //获取canvas对象(画布)
    var ctx = canvas.getContext('2d');  //获取对应的画笔对象
    
    canvas.width = 800;
    canvas.height = 600;
    
    ctx.strokeStyle = '#FF9933';   //线条的颜色
    ctx.lineWidth = 10;  //线条的宽度
    ctx.lineCap = 'roound'; //线条两边的形状
    //注意,canvas的坐标系是:canvas画布的左上角为原点(0,0),向右为横坐标,向下为纵坐标,单位是像素px
    
    //开始一个新的绘制路径
    ctx.beginPath();
    ctx.moveTo(50, 50);  //定义直线额起点坐标为(50,50)        
    ctx.lineTo(350, 250);  //定义直线的终点坐标为(350,250) 
    ctx.moveTo(50, 240); 
    ctx.lineTo(360, 60); 
    ctx.moveTo(50, 200); 
    ctx.lineTo(
    300, 40); //沿着坐标点顺序的路径绘制直线 ctx.stroke(); //关闭当前的绘制路径 ctx.closePath();

         三:绘制曲线及圆弧

        arc(x, y, radius, startRad, endRad, anticlockwise)

        在canvas画布上绘制以坐标点(x,y)为圆心、半径为radius的圆上的一段弧线。这段弧线的起始弧度是startRad,结束弧度是endRad。这里的弧度是以x轴正方向(时钟三点钟)为基准、进行顺时针旋转的角度来计算的。anticlockwise表示是以逆时针方向还是顺时针方向开始绘制,如果为true则表示逆时针,如果为false则表示顺时针。anticlockwise参数是可选的,默认为false,即顺时针。

    arc()方法中的弧度计算方式

            var canvas = document.getElementById('canvas');   //获取canvas对象(画布)
            var ctx = canvas.getContext('2d');  //获取对应的画笔对象
    
            canvas.width = 800;
            canvas.height = 600;
    
            //开始一个新的绘制路径
            ctx.beginPath();
            //设置弧线的颜色为蓝色
            ctx.strokeStyle = 'blue';
            var circle = {
                x:100,    //圆心的x轴坐标值
                y:100,    //圆心的y轴坐标值
                r:50      //圆的半径
            };
            //沿着坐标点(100,100)为圆心,半径为50px的圆的顺时针方向绘制弧线
            ctx.arc(circle.x,circle.y,circle.r,0,Math.PI/2,false);  //false是顺时针方向,true表示逆时针方向
            //按照指定的路径绘制弧线
            ctx.stroke();

      

      四:canvas绘制一个八卦 

    <canvas id="canvas">你的浏览器不支持canvas!</canvas>
    #canvas{
            display:block;
            margin:0 auto;
            border:1px solid #aaa;
            background:#E1E1FF;
        }
            document.body.style.backgroundColor = '#eee';
            var canvas = document.getElementById('canvas');   //获取canvas对象(画布)
            var ctx = canvas.getContext('2d');  //获取对应的画笔对象
    
            canvas.width = 400;
            canvas.height = 500;
    
            //绘制白色半圆
            ctx.beginPath();
            ctx.arc(200,200,80,1.5*Math.PI,Math.PI/2,false);
            ctx.fillStyle = 'white';
            ctx.closePath();
            ctx.fill();
    
            //绘制黑色半圆
            ctx.beginPath();
            ctx.arc(200,200,80,Math.PI/2,1.5*Math.PI,false);
            ctx.fillStyle = 'black';
            ctx.closePath();
            ctx.fill();
    
            //绘制黑色小圆
            ctx.beginPath();
            ctx.arc(200,240,40,0,Math.PI*2,false);
            ctx.fillStyle = 'black';
            ctx.closePath();
            ctx.fill();
    
            //绘制白色小圆
            ctx.beginPath();
            ctx.arc(200,160,40,0,Math.PI*2,false);
            ctx.fillStyle = 'white';
            ctx.closePath();
            ctx.fill();
    
            //绘制白色小圆心
            ctx.beginPath();
            ctx.arc(200,160,5,0,Math.PI*2,false);
            ctx.fillStyle = 'black';
            ctx.closePath();
            ctx.fill();
    
            //绘制黑色小圆心
            ctx.beginPath();
            ctx.arc(200,240,5,0,Math.PI*2,false);
            ctx.fillStyle = 'white';
            ctx.closePath();
            ctx.fill();
    
    
            //绘制文字
            ctx.save();
            ctx.fillStyle = 'black';
            ctx.globalAlpha = '0.4';
            ctx.textAlign ='center';
            ctx.font = '32px Arial';
            ctx.shadowColor="rgba(0,0,0,0.4)"; 
            ctx.shadowOffsetX=15; 
            ctx.shadowOffsetY=-10; 
            ctx.shadowBlur=2; 
            ctx.fillText('Hello Canavs',200,100);//IE不支持 
             
            ctx.restore();

          

     

  • 相关阅读:
    P2890 [USACO07OPEN]Cheapest Palindrome G 题解
    「NOIP2021模拟赛 By JXC C」位运算 题解
    AT5759 ThREE 题解
    P7532 [USACO21OPEN] Balanced Subsets P 题解
    linux下的pdf分割合并软件
    Python小练习 SDUT 2521 出现次数
    小问题备查持续更新
    Python小练习自动登录人人发送消息并返回好友列表
    Debian系使用小红点
    linux权限问题学习总结
  • 原文地址:https://www.cnblogs.com/hl-520/p/5725366.html
Copyright © 2011-2022 走看看