Canvas绘图接口(直线)

规划矩形路径(需要自己进行填充和绘制)

/**
这里需要传入
x----起始的X坐标
y----起始的Y坐标
width----矩形的宽
height----矩形的高
*/
context.rect(x,y,width,height);
context.lineWidth = 10;
context.fillStyle = 'red';
context.fill();
context.stroke();

直接绘制矩形

这里与之前的rect()不同之处在于,rect()方法只是规划处矩形的路径,绘制还是需要自己调用stroke()方法进行绘制的,而下面的这两个方法则直接绘制出矩形

//使用当前的fillstyle绘制出一个填充的矩形
context.fillRect(x,y,width,height);
//使用当前的strokeStyle绘制出一个带边框的矩形
context.strokeRect(x,y,width,height)

设置线条两端形状

var canvas = document.getElementById('canvas');
        canvas.width = 1000;
        canvas.height = 800;
        //2d绘图
        var context = canvas.getContext('2d');
        context.lineWidth = 50;

        context.beginPath();
        context.moveTo(100,100);
        context.lineTo(700,100);
        context.lineCap = 'butt';/*butt正常显示*/
        context.stroke();

        context.beginPath();
        context.moveTo(100,200);
        context.lineTo(700,200);
        context.lineCap = 'round';/*round会在线条两端多出来两个半圆*/
        context.stroke();

        context.beginPath();
        context.moveTo(100,300);
        context.lineTo(700,300);
        context.lineCap = 'square';/*square会在线条两端多出两个四方块*/
        context.stroke();

线条相交时所呈现的形态

/*
lineJoin有3个值
bevel:使线与线相交的地方不是尖角,而是折叠效果
round:线条相接时使用圆形光滑过渡
miter:显示尖角

*/
context.lineJoin='bevel';
/**
miterLimit只有当lineJoin为miter时,该属性才有效,默认值是10
*/
context.miterLimit = 20;

画一个五角星

    var canvas = document.getElementById('canvas');
        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');

        context.lineWidth = 10;
        drawStar(context,400,400,300,150,0);
        /**
         * [drawStar description]
         * @param  {[type]} cxt    [绘图上下文]
         * @param  {[type]} x      [偏移量x]
         * @param  {[type]} y      [偏移量y]
         * @param  {[type]} outerR [大圆的半径]
         * @param  {[type]} innerR [小圆的半径]
         * @param  {[type]} rot    [五角星旋转的角度]
         * @return {[type]}        [description]
         */
            function drawStar(cxt,x,y,outerR,innerR,rot){
                cxt.beginPath();
                for(var i = 0; i < 5;i++){
                    cxt.lineTo(Math.cos((18 + i * 72)/180 * Math.PI) * outerR + x,

                                -Math.sin((18 + i * 72) / 180 * Math.PI) * outerR + y);
                    cxt.lineTo(Math.cos((54 + i * 72)/180 * Math.PI) * innerR + x,

                                -Math.sin((54 + i * 72) / 180 * Math.PI) * innerR + y);
                }
                cxt.closePath();
                cxt.stroke();
            }

五角星实现原理

绘制一片星空

context.fillStyle = '#000000';
        //直接绘制一个矩形,即代表星空
        context.fillRect(0,0,canvas.width,canvas.height);
        //绘制很多个不同的五角星
        for(var i = 0 ; i <200 ; i++){
            //得到不同大小的圆的半径
            var r = Math.random() * 10 + 10;//获取10~20之间的随机数
            var x = Math.random() * canvas.width;//获取随机的x偏移量,0~画布宽度之间的随机值
            var y = Math.random() * canvas.height;
            var rot = Math.random() * 360;//获取角度在0~360度之间的角度
            drawStar(context,x,y,r,r/2,rot);

        }

图形变换和状态保存

状态保存

save()和restore()方法

<script type="text/javascript">
        var canvas = document.getElementById('canvas');

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');
        /**
         * translate会改变canvas的原点坐标,在使用translate移动到100,100时,继续使用fillRect在0,0点绘制时,回绘制在canvas的100,100的位置
         * 而在移动了坐标之后,后面再使用translate时,会在原来的基础上进行移动,即后面的translate(300,300)不是将canvas的原点移动到300,300的位置,而是移动在400,400的位置
         *
         * 加上save()和restore(),就会在每次一绘制之前先保存本次的绘制状态,绘制完成之后再使用restore进行恢复到原始状态
         * @type {String}
         */

        /**
         * 建议在绘制图形时,如果图形要进行变换或者动画,那么都需要先save()保存绘制状态,完成之后进行restore()恢复
         */
        context.save();
        context.fillStyle = 'red';
        context.translate(100,100);
        context.fillRect(0,0,400,400);
        context.restore();

        context.save();
        context.fillStyle = 'green';
        context.translate(300,300);
        context.fillRect(0,0,400,400);
        context.restore();
    </script>

图形变换

translate(),rotate(),scale()

<script type="text/javascript">
    /**
     * 图像变换:
     * 1:translate(x,y)
     * 2:rotate(deg)
     * 3:scale()---不仅进行大小的缩放,而且对图形的坐标,图形的边框宽度也会进行缩放,所以谨慎使用
     * @type {[type]}
     */
        var canvas = document.getElementById('canvas');

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');
        context.fillStyle = '#000000';
        //直接绘制一个矩形,即代表星空
        context.fillRect(0,0,canvas.width,canvas.height);
        //绘制很多个不同的五角星
        for(var i = 0 ; i <200 ; i++){
            //得到不同大小的圆的半径
            var r = Math.random() * 10 + 10;//获取10~20之间的随机数
            var x = Math.random() * canvas.width;//获取随机的x偏移量,0~画布宽度之间的随机值
            var y = Math.random() * canvas.height;
            var rot = Math.random() * 360;//获取角度在0~360度之间的角度
            drawStar(context,x,y,r,rot);

        }
        /**
         * 绘制星空
         */
        function drawStar(cxt,x,y,R,rot){
            cxt.save();

            //进行平移操作
            cxt.translate(x,y);
            //进行旋转操作
            cxt.rotate(rot/180 * Math.PI);
            //使用scale进行缩放,但是为防止对边框宽度进行缩放,就需要将跟边框相关的属性去掉
            cxt.scale(R,R);
            startPath(cxt);

            cxt.fillStyle = '#fb3';
            /*cxt.strokeStyle = '#fb5';
            cxt.lineWidth = 3;
            cxt.lineJoin = 'round';*/

            cxt.fill();
            //cxt.stroke();
            cxt.restore();
        }
        /*绘制单个标准五角星的函数*/
        function startPath(cxt){
            cxt.beginPath();
            for(var i = 0 ; i<5;i++){
                cxt.lineTo(Math.cos((18 + i * 72)/180 * Math.PI) ,

                                -Math.sin((18 + i * 72) / 180 * Math.PI) );
                    cxt.lineTo(Math.cos((54 + i * 72)/180 * Math.PI) * 0.5,

                                -Math.sin((54 + i * 72) / 180 * Math.PI) * 0.5 );
            }
        }
    </script>

变换矩阵

transform(),setTransform()
这里写图片描述

<script type="text/javascript">
    /**
     * transform(a,b,c,d,e,f)
     * 
     * 变换矩阵
     * a  c  e       
     * b  d  f
     * 0  0  1
     * 默认为单位矩阵
     * 1  0  0
     * 0  1  0
     * 0  0  1
     * a,d 水平、垂直缩放
     * b,c 水平、垂直倾斜
     * e,f 水平、垂直位移
     * 
     * @type {[type]}
     */
        var canvas = document.getElementById('canvas');

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');

        context.fillStyle = 'red';
        context.strokeStyle = '#058';
        context.lineWidth = 5;
        context.save();
        context.transform(2,0.2,0.2,1.5,50,50);
        context.fillRect(50,50,300,300);
        context.strokeRect(50,50,300,300);
    </script>

transform()函数是可以级连的,即设置了好几个transform,下面的会在原有的基础上进行叠加

context.transform(2,0.2,0.2,1.5,50,50);
context.transform(2,0.2,0.2,1.5,50,50);
context.transform(2,0.2,0.2,1.5,50,50);

要想清楚掉原有的transform,使用setTransform(a,b,c,d,e,f),会重新进行变换

填充样式

线性渐变

<script type="text/javascript">
    var canvas = document.getElementById('canvas');

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');
    /**
     * Step 1
     * [create description]
     * @param  {[type]} xstart []
     * @param  {[type]} ystart [description]
     * @param  {[type]} xend   [description]
     * @param  {[type]} yend   [description]
     * @return {[type]}        [description]
     *
     * 两个坐标构成了一条线,这条线是渐变线
     */
    var grd = context.createLinearGradient(xstart,ystart,xend,yend);

    /**
     * Step 2
     * [ss description]
     * @param  {[type]} stop  [浮点值,决定关键色的位置]
     * @param  {[type]} color [关键色的颜色]
     * @return {[type]}       [description]
     */
    grd.addColorStop(stop,color);

    /**
     * 经过上面两步,grd就可以作为一个变量传递给fillStyleL了
     */
</script>

<script type="text/javascript">
    var canvas = document.getElementById('canvas');

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');

    //斜线渐变
    // var linearGrad = context.createLinearGradient(0,0,800,800);
    //水平渐变线
    var linearGrad = context.createLinearGradient(0,0,800,0);
    //垂直渐变线
    // var linearGrad = context.createLinearGradient(0,0,0,800);

    linearGrad.addColorStop(0,'#fff');
    linearGrad.addColorStop(0.5,'#ddd');
    linearGrad.addColorStop(1,'#000');

    context.fillStyle = linearGrad;
    context.fillRect(0,0,800,800);
</script>

径向渐变

呈放射状,是基于两个圆之间的,而线性渐变是基于一条线之间的渐变

<!-- <script type="text/javascript">
    /**
     * 从(x0,y0)为圆心,r0为半径的圆开始
     * 到(x1,y1)位圆心,r1位半径的圆进行径向渐变
     */
    var grd = context.createRadialGradient(x0,y0,r0,x1,y1,r1);

    grd.addColorStop(stop,color);
</script> -->

<script type="text/javascript">
    var canvas = document.getElementById('canvas');

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');

    //径向渐变
    var radialGrad = context.createRadialGradient(400,400,0,400,400,500);

    radialGrad.addColorStop(0,'#fff');
    radialGrad.addColorStop(1,'#000');

    context.fillStyle = radialGrad;
    context.fillRect(0,0,800,800);
</script>

使用图片、画布、video填充画布

使用图片
<!--使用图片填充画布-->
<script type="text/javascript">
    var canvas = document.getElementById('canvas');

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');

    var bgImage = new Image();
    bgImage.src = 'banner_cogobuy_750_444.png';
    bgImage.onload = function(){
        /**
         * repeat:x,y方向都会重复
         * no-repeat
         * repeat-x
         * repeat-y
         * @type {[type]}
         */
        var pattern = context.createPattern(bgImage,'repeat');
        context.fillStyle = pattern;
        context.fillRect(0,0,800,800);
    }
</script>
使用自定义的画布进行填充
<!--使用画布进行填充
    可以让我们自己绘制,自己填充图案
-->
<script type="text/javascript">
    var canvas = document.getElementById('canvas');

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext('2d');

        ```var backCanvas = createCanvas();
        var pattern = context.createPattern(backCanvas,'repeat');```
        context.fillStyle = pattern;
        context.fillRect(0,0,800,800);


    //创建一个画布并返回
    function createCanvas(){
        var bgCanvas = document.createElement('canvas');
        bgCanvas.width = 100;
        bgCanvas.height = 100;
        var bgCanvasContext = bgCanvas.getContext('2d');
        drawStar(bgCanvasContext,50,50,50,0);
        return bgCanvas;
    }
    /**
     * 绘制星空
     */
    function drawStar(cxt,x,y,R,rot){
        cxt.save();

        //进行平移操作
        cxt.translate(x,y);
        //进行旋转操作
        cxt.rotate(rot/180 * Math.PI);
        //使用scale进行缩放,但是为防止对边框宽度进行缩放,就需要将跟边框相关的属性去掉
        cxt.scale(R,R);
        startPath(cxt);

        cxt.fillStyle = '#fb3';
        /*cxt.strokeStyle = '#fb5';
        cxt.lineWidth = 3;
        cxt.lineJoin = 'round';*/

        cxt.fill();
        //cxt.stroke();
        cxt.restore();
    }
    /*绘制单个五角星的函数*/
    function startPath(cxt){
        cxt.beginPath();
        for(var i = 0 ; i<5;i++){
            cxt.lineTo(Math.cos((18 + i * 72)/180 * Math.PI) ,

                            -Math.sin((18 + i * 72) / 180 * Math.PI) );
                cxt.lineTo(Math.cos((54 + i * 72)/180 * Math.PI) * 0.5,

                            -Math.sin((54 + i * 72) / 180 * Math.PI) * 0.5 );
        }
    }
</script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值