zoukankan      html  css  js  c++  java
  • HTML5 CANVAS画图 beginPath和closePath

    转载:http://www.cnblogs.com/huaan011/p/5651806.html

    beginPath这个canvas函数我很早就讲过了,他的作用很简单,就是开始一段新路径,我们先来看下面的一小段代码:

    复制代码

    var ctx = document.getElementById('cvs').getContext('2d');
    ctx.beginPath();
    ctx.moveTo(100.5,20.5);
    ctx.lineTo(200.5,20.5);
    ctx.stroke();
    ctx.moveTo(100.5,40.5);
    ctx.lineTo(200.5,40.5)
    ctx.strokeStyle = '#f00';
    ctx.stroke();

    复制代码

    上面的代码会得到什么样的图形呢?是不是一条黑线一条红线呢?

    从代码上看,我们的逻辑毫无问题,但结果是我们得到的是两条红线,并不是一黑一红。

    如果你明白这是为什么,那后面的你就不用看了。这就是beginPath的重要性。

    canvas中的绘制方法(如stroke,fill),都会以“上一次beginPath”之后的所有路径为基础进行绘制。比如上面的代码里面我stroke了两次,其实这两次都是以第一次beginPath后的所有路径为基础画的。也就是说第一条路径我们stroke了两下,第一下是黑的,第二下是红的,所以最终也是红的。

    1. 不管你用moveTo把画笔移动到哪里,只要不beginPath,那你一直都是在画一条路径。
    2. fillRect与strokeRect这种直接画出独立区域的函数,也不会打断当前的path.

    如果你画出的图形和你想像的不一样,记得查看是否有合理的beginPath.

    说到beginPath,就不得不提到closePath,两者是不是有很“紧”的联系呢?答案是几乎没有关系。

    closePath的意思不是结束路径,而是关闭路径,它会试图从(MoveTo点之后)当前路径的终点连一条路径到起点,让整个路径闭合起来。但是,这并不意味着它之后的路径就是新路径了!

    我们在上面的代码的第一个lineTo后面加上closePath,可以发现还是得到了两条红线。

    但如果我们在第一个stroke后面加上beginPath,则会如愿得到一条黑线一条红线。

    复制代码

    ctx.stroke();
    ctx.beginPath(); //注意啦!
    ctx.moveTo(100.5,40.5);
    ctx.lineTo(200.5,40.5)
    ctx.strokeStyle = '#f00';
    ctx.stroke();

    复制代码

    总而言之,就是不要企图通过闭合现有路径来开始一条新路径,而开始一条新路径,以前的路径也不会闭合。

    复制代码

     var ctx = document.getElementById('myCanvas').getContext('2d');
            ctx.beginPath();
            ctx.moveTo(100.5, 20.5);
            ctx.lineTo(200.5, 20.5);
    
            ctx.moveTo(110.5, 25.5);
            ctx.lineTo(210.5, 25.5);
            //ctx.stroke();
            //ctx.beginPath();
            //ctx.moveTo(100.5, 40.5);
            ctx.lineTo(200.5, 40.5)
            ctx.strokeStyle = '#f00';
            ctx.closePath();
            ctx.stroke();

  • 相关阅读:
    LeetCode——字符串解码
    LeetCode——迷宫 i-ii
    JavaScript实现按照指定长度为数字前面补零输出的方法
    React 修改input按钮上文字
    HTML input可以输入相同的文件
    LeetCode——重新安排行程
    LeetCode——矩阵中的最长递增路径
    c++ vector push_back对象的时候存起来的是拷贝
    char* = "name" g++报告warn的原因
    虚函数表指针、父类成员变量、子类成员变量在内存中的位置关系
  • 原文地址:https://www.cnblogs.com/ggds/p/7047283.html
Copyright © 2011-2022 走看看