canvas教程

Canvas学习:绘制虚线和圆点线

字号+ 作者:H5之家 来源:H5之家 2017-04-25 15:01 我要评论( )

Canvas学习:绘制虚线和圆点线,上一节中,使用 moveTo() 、 lineTo() 和 stroke() 可以很轻易的在Canvas中绘制出实线(线段)。整篇文章中看到的都是绘制实现。

上一节中,使用 moveTo() 、 lineTo() 和 stroke() 可以很轻易的在Canvas中绘制出实线(线段)。整篇文章中看到的都是绘制实现。不知道你和我是不是一样的好奇,那么要在Canvas中绘制虚线和圆点线又要怎么绘制,在Canvas有没有类似的API能直接绘制呢?

其实我也很好奇,看了一些资料,要像绘制实线那样简单或者直接,相对来说是没有的,但不用担心,通过其他的方法也是可以实现的。因为JavaScript是一门万能的语言,那么接下来的内容,就来看看如何在Canvas中绘制虚线和圆点线。

绘制虚线

在MDN上,我查到一个叫 CanvasRenderingContext2D.setLineDash() 的API。官方介绍:

CanvasRenderingContext2D.setLineDash() 是 Canvas 2D API 设置虚线样式的方法。

使用方式很简单:

ctx.setLineDash(segments);

其接受一个参数 segments ,这个参数是一个 Array 数组。一组描述交替绘制线段和间距(坐标空间单位)长度的数字。如果数组元素的数量是奇数,数组的元素会被复制并重复。例如, [5,15,25] 会变成 [5,15,25,5,15,25] 。

言外之意,在Canvas中,可以使用 setLineDash 方法来绘制虚线。既然有这样的方法,那还等什么呢?动手吧。

function drawScreen() { ctx.setLineDash([5,15]); ctx.lineWidth = 4; ctx.strokeStyle = '#f36'; ctx.beginPath(); ctx.moveTo(10, 100); ctx.lineTo(400, 100); ctx.stroke(); }

Canvas学习:绘制虚线和圆点线

咱们来改变一下 setLineDash() 里面的值:

ctx.setLineDash([25,5]);

效果变成:

Canvas学习:绘制虚线和圆点线

将上图放大来看:

Canvas学习:绘制虚线和圆点线

上图是 setLineDash([25,5]) 的效果,第一个虚线点是 25 个像素,第二个空白点是 5 个像素。然后按这样的组合在不断的循环,直到线段的终点。那么如果,我们把上面的示例再做一下调整:

function drawScreen() { ctx.lineWidth = 4; ctx.beginPath(); ctx.setLineDash([40,30,20]); ctx.strokeStyle = '#f36'; ctx.moveTo(10, 100); ctx.lineTo(400, 100); ctx.stroke(); ctx.beginPath(); ctx.setLineDash([40,30,20,10]); ctx.strokeStyle = 'blue'; ctx.moveTo(10, 120); ctx.lineTo(400, 120); ctx.stroke(); }

Canvas学习:绘制虚线和圆点线

同样我们把它们放大来看,这样好理解一点:

Canvas学习:绘制虚线和圆点线

上图应该解释清楚了吧。简单的理解 setLineDash([]) 值,“线|间距”,不断的循环。如此一来,在绘制虚线时,就需要注意他们的循环次数,以及你需要的虚线格式,不然说不定绘制出来的虚线,并不是你所需要的哟。

其实如果你想线和间距一样大小,最简单的方法,就是只给 setLineDash() 传一个值:

ctx.setLineDash([10]);

Canvas学习:绘制虚线和圆点线

上面实现了,我们所说的虚线,也就是CSS中的 dashed 。除此之外,还有圆点线( dotted )。接下来就来看,怎么在Canvas中绘制圆点线。

绘制圆点线

查了一下,在Canvas中没有直接绘制圆点(dotted)线的API。也就是说,如果要绘制这样的线段(路径)需要特殊处理。也就是说,需要通过JavaScript另外封装一个API。比如封装一个 CanvasRenderingContext2D.dottedLine ,然后通过 context.dottedLine 绘制。接下来,看看如何封装这个API:

var canvasPrototype = window.CanvasRenderingContext2D && CanvasRenderingContext2D.prototype; canvasPrototype.dottedLine = function (x1,y1, x2, y2, interval) { if (!interval) { interval = 5; } var isHorizontal = true; if (x1 == x2) { isHorizontal = false; } var len = isHorizontal ? x2 - x1 : y2 - y1; this.moveTo(x1, y1); var progress = 0; while (len > progress) { progress += interval; if (progress > len) { progress = len; } if (isHorizontal) { this.moveTo(x1 + progress, y1); this.arc(x1 + progress, y1, 1, 0, Math.PI * 2, true); this.fill(); } else { this.moveTo(x1, y1 + progress); this.arc(x1, y1 + progress, 1, 0, Math.PI * 2, true); this.fill(); } } }

在Canvas画布中,通过下面的方式就可以绘制圆点线:

context.dottedLine(10, 100, 200, 200);

Canvas学习:绘制虚线和圆点线

当 x1 和 x2 的值相等时,可以绘制竖线:

context.dottedLine(10, 100, 10, 200);

Canvas学习:绘制虚线和圆点线

同时我们也可以改变间距值:

context.dottedLine(10, 100, 200, 200, 10);

Canvas学习:绘制虚线和圆点线

使用类似的方法,我们就可以绘制一个圆点线的距形:

context.dottedLine(10, 100, 200, 200, 10); context.dottedLine(10, 100, 10, 200, 10); context.dottedLine(200, 100, 200, 200, 10); context.dottedLine(10, 200, 200, 200, 10);

效果如下:

Canvas学习:绘制虚线和圆点线

这样一来是不是也很简单。其实除了封装成Canvas的API之外,我们是不是也可以将其封装成一个函数呢?思考一下?

总结

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • canvas之图形的变化(平移 缩放 旋转)

    canvas之图形的变化(平移 缩放 旋转)

    2017-04-26 08:02

  • Canvas 学习笔记(一)

    Canvas 学习笔记(一)

    2017-04-25 15:00

  • HTML5 Canvas自定义圆角矩形与虚线(Rounded Rectangle and Dash

    HTML5 Canvas自定义圆角矩形与虚线(Rounded Rectangle and Dash

    2017-04-25 13:01

  • Canvas学习:绘制矩形

    Canvas学习:绘制矩形

    2017-04-24 17:02

网友点评
i