canvas的Beginpath和Closepath理解

    xiaoxiao2021-03-25  75

    beginPath()方法

       

    [javascript]  view plain  copy   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 ( ) ;  

    其中的0.5是为了避免线条模糊问题。那么上面的代码会得到什么样的图形呢?是不是一条黑线一条红线呢?

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

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

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

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

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

    ————————————–

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

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

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

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

         [javascript]  view plain  copy   ctx. stroke ( ) ;    ctx. beginPath ( ) ; //注意啦!    ctx. moveTo ( 100.5 , 40.5 ) ;    ctx. lineTo ( 200.5 , 40.5 )    ctx. strokeStyle = '#f00' ;    ctx. stroke ( ) ;   

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

    转载请注明原文地址: https://ju.6miu.com/read-37802.html

    最新回复(0)