html5 canvas 提供了很多图形绘制的函数,但是很可惜,canvas api只提供了画实线的函数(lineto),却并未提供画虚线的方法。这样的设计有时会带来很大的不便,《javascript权威指南》的作者david flanagan就认为这样的决定是有问题的,尤其是在标准的修改和实现都比较简单的情况下 (“…something that is so trivial to add to the specification and so trivial to implement… i really think you’re making a mistake here” —)。8 R' y7 w6 P. T8 I' x1 w
在stack overflow上,phrogz提供了一个自己的画虚线的实现(),严格的说,这是一个点划线的实现(p.s. 我认为该页面上rod macdougall的简化版更好)。那么,如果需要画圆点虚线(如下图所示),应该怎么办呢?" ~% e$ C- q! |1 m
0 S" S) y+ L* o! b1 D
以下是我自己的实现,只支持画水平的和垂直的圆点虚线,可以参考phrogz与rod macdougall的方法来添加斜线描画的功能。
. E" b' \# t0 M5 K1 s* G代码如下:) s4 E& J0 k f. n+ z
var canvasprototype = window.canvasrenderingcontext2d && canvasrenderingcontext2d.prototype;
, Y4 T3 @- _2 m& scanvasprototype.dottedline = function(x1, y1, x2, y2, interval) {
! o, m% ^' ^0 Wif (!interval) {& ?0 V# k, |- I3 O
interval = 5;
% T0 t: V4 p$ a5 {- j2 @0 ~" b}
+ l. W! v& \( i* Avar ishorizontal=true;! ?$ I. Z& Q- B" F3 D, Y8 E, U
if (x1==x2){9 `5 e% A# v. ^7 V a& p
ishorizontal=false;
! {7 ^& m+ |( r7 X}
$ [; e3 d3 U; l8 L8 `var len = ishorizontal ? x2-x1 : y2-y1;$ Z D5 f! ?' e$ |/ g
this.moveto(x1, y1);
( d$ O; P; W/ B2 B lvar progress=0;" t6 u% L4 A( A* m
while (len > progress) {
' V0 i. Y% s Z3 M [6 A9 rprogress += interval;
& j5 y1 L- k/ l3 n' X( U2 R% lif (progress > len) {
0 P; y" @5 [- x8 {+ @+ mprogress = len;
. ?* I. A/ N( W( X; \}
" {, s, U; {* {( xif (ishorizontal) {
. X$ G. \1 b$ K7 h- n- Dthis.moveto(x1+progress,y1);. D: k; G3 |# v% X( p
this.arc(x1+progress,y1,1,0,2*math.pi,true);; {# \% n7 X) O( w5 v
this.fill();4 D! O- w' Z9 N: \: ]
} else {
* s1 i D$ X% p7 W3 e) Tthis.moveto(x1,y1+progress);) S T* `9 Q6 C. {1 t3 O! N* h6 q0 A
this.arc(x1,y1+progress,1,0,2*math.pi,true);+ G& d: J& d; H
this.fill();
3 j" Y% c `2 E5 @2 h}
. b5 g9 B1 ~$ G- F" N, J}- H8 K, m8 N9 _+ D: T
}
# a) K: C% R5 p, X$ u+ L7 J1 _+ x" T1 o' u
更多网页制作信息请查看: 网页制作 |
|