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” —)。
) H' b3 ]( t ?; w在stack overflow上,phrogz提供了一个自己的画虚线的实现(),严格的说,这是一个点划线的实现(p.s. 我认为该页面上rod macdougall的简化版更好)。那么,如果需要画圆点虚线(如下图所示),应该怎么办呢?
" u- d `( q2 O9 G* B: ^) }+ j7 h* D, U; d) X! r7 ?
以下是我自己的实现,只支持画水平的和垂直的圆点虚线,可以参考phrogz与rod macdougall的方法来添加斜线描画的功能。
+ i0 G: r" A1 n# G代码如下:. E4 O9 L3 Q5 A$ M9 J
var canvasprototype = window.canvasrenderingcontext2d && canvasrenderingcontext2d.prototype;
5 ~: J. m2 e: K( b1 v9 Pcanvasprototype.dottedline = function(x1, y1, x2, y2, interval) {1 _0 E/ |$ Q% u: y
if (!interval) {) e4 k- F3 ]2 `1 U
interval = 5;
! c2 n4 T+ J9 C3 Z+ w+ k}8 U |; o8 a$ R8 b2 D n
var ishorizontal=true;1 Q' R" h' q3 E3 W( ^: s
if (x1==x2){% E) ^! s0 k! N2 j# h" O; o
ishorizontal=false;
! S8 W, z$ a C8 Q# W" b" o}/ @4 U5 k8 g8 ~5 }* P7 J i
var len = ishorizontal ? x2-x1 : y2-y1;
o+ T1 ?) j2 {this.moveto(x1, y1);2 f2 ]# z% V7 u0 O" ], y0 H, s
var progress=0;$ [ L0 Z. i* [# Z
while (len > progress) {$ t) |; j2 { \3 E+ ~, G3 q
progress += interval;8 D/ u1 W8 h) K/ [, [2 k6 \( E% a
if (progress > len) {
$ C" j: {0 ?) k3 @progress = len;/ {+ E/ W( [, M' x9 B
}
" C& N( e- I5 j* Qif (ishorizontal) {
5 l' s. U/ z: A+ F; Sthis.moveto(x1+progress,y1);
4 I( Y% r: K* rthis.arc(x1+progress,y1,1,0,2*math.pi,true);
/ L! T j$ X3 H; r0 Y5 Ethis.fill();
% r% q/ ?8 M& e; J6 z} else {
) M3 |2 k- G* n- r* B Sthis.moveto(x1,y1+progress);
4 P1 e8 I! x3 Pthis.arc(x1,y1+progress,1,0,2*math.pi,true);. E/ m L, o' |. _# P& m
this.fill();
) ] @3 t1 O( \4 e# b}
( s4 U: z `) e}
- I+ v# g7 k2 ?* O6 k8 r9 ]}
' d7 n; l% G. h1 o& B8 l- L$ |6 I7 u
更多网页制作信息请查看: 网页制作 |
|