2013-03-13 65 views
21

Tôi muốn vẽ một số đường nét đứt trên canvas HTML5. Nhưng tôi không thể tìm thấy có một tính năng như vậy. đường dẫn canvas chỉ có thể vẽ các đường liền nét. Và mọi người đã cố gắng sử dụng một số tính năng biên giới (chấm, gạch ngang) trong CSS để vẽ các đường đứt nét, nhưng chúng chỉ có thể nằm ngang hoặc dọc. Vì vậy, tôi đã bị mắc kẹt về điều này. Tôi cũng tìm thấy một thư viện có tên là RGraph và nó có thể vẽ các đường đứt nét. Nhưng sử dụng một thư viện bên ngoài sẽ làm cho bản vẽ thực sự chậm. Vậy cơ thể nào cũng có ý tưởng làm thế nào để thực hiện điều này? Bất kỳ trợ giúp sẽ được đánh giá cao.Vẽ các đường nét đứt trên Canvas HTML5?

+0

"sử dụng một thư viện bên ngoài sẽ làm cho các bản vẽ rất chậm" - những gì làm cho bạn lại nói thế? –

+1

Đồng đội của tôi đã cố gắng sử dụng một thư viện để vẽ những đường nét đứt quãng đó. Có khoảng 20 dòng trên canvas, nhưng tạo sự khác biệt lớn về hiệu suất. Khi người dùng tương tác với canvas, bạn có thể thấy sự chậm trễ khá rõ ràng nếu bạn kéo canvas. Mất nhiều thời gian hơn để vẽ lại chúng. –

+0

http://en.wikipedia.org/wiki/Correlation_does_not_imply_causation - Đó có thể là kỹ thuật mà thư viện đã sử dụng gây ra sự chậm trễ, thay vì thực tế là nó được đóng gói vào thư viện. –

Trả lời

4

Vẽ nét đứt trên vải

tôi cung cấp này lên không như một giải pháp hoàn chỉnh, nhưng là một cách đơn giản để vẽ một đường nét đứt giữa bất kỳ 2 điểm (một dòng ở bất kỳ góc). Nó rút ra rất nhanh.

Bạn có thể sửa đổi nó để phù hợp với nhu cầu của một đường đứt nét. Vẽ dấu gạch ngang không nên làm chậm bản vẽ.

Đây là mã và một Fiddle: http://jsfiddle.net/m1erickson/pW4De/

 var canvas=document.getElementById("canvas"); 
     var ctx=canvas.getContext("2d"); 

     DrawDottedLine(300,400,7,7,7,20,"green"); 

     function DrawDottedLine(x1,y1,x2,y2,dotRadius,dotCount,dotColor){ 
      var dx=x2-x1; 
      var dy=y2-y1; 
      var spaceX=dx/(dotCount-1); 
      var spaceY=dy/(dotCount-1); 
      var newX=x1; 
      var newY=y1; 
      for (var i=0;i<dotCount;i++){ 
        drawDot(newX,newY,dotRadius,dotColor); 
        newX+=spaceX; 
        newY+=spaceY;    
      } 
      drawDot(x1,y1,3,"red"); 
      drawDot(x2,y2,3,"red"); 
     } 
     function drawDot(x,y,dotRadius,dotColor){ 
      ctx.beginPath(); 
      ctx.arc(x,y, dotRadius, 0, 2 * Math.PI, false); 
      ctx.fillStyle = dotColor; 
      ctx.fill();    
     } 
+0

Hi @markE, cảm ơn bạn rất nhiều vì đã hiển thị giải pháp này. Tuy nhiên, các dòng chúng ta cần phải thử không nhất thiết phải là đường thẳng. Vì vậy, tôi nghĩ rằng giải pháp này có thể không hoạt động. Nhưng cảm ơn tất cả các bạn giống nhau !! –

16

FYI - chấm và đứt nét là một phần của một số tính năng vải mới mà bây giờ là trong spec - và đã được thực hiện trong Chrome:

http://www.rgraph.net/blog/2013/january/html5-canvas-dashed-lines.html

+0

liên kết chết, phiên bản đã lưu trữ: http://web.archive.org/web/20140720073758/http://www.rgraph.net/blog/2013/january/html5-canvas-dashed-lines.html – lincolnk

+0

Không chết bất kỳ nhiều hơn mặc dù - trang web là sao lưu – Richard

31
var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 
ctx.setLineDash([5, 3]);/*dashes are 5px and spaces are 3px*/ 
ctx.beginPath(); 
ctx.moveTo(0,100); 
ctx.lineTo(400, 100); 
ctx.stroke(); 

JsFIDDLE

+0

thx này hoạt động tuyệt vời. – louisinhongkong

+0

Đối với người đọc trong tương lai, câu trả lời của javadeveloper dưới đây có điểm số thấp hơn nhưng không yêu cầu xác định bất kỳ chức năng nào - nó sử dụng phương thức setin setLineDash(). – Seb

+1

Điều này cần phải là câu trả lời được chấp nhận –

14

Đây là một cách dễ dàng hơn để tạo đường đứt nét:

var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 

ctx.setLineDash([5, 15]); 

ctx.beginPath(); 
ctx.moveTo(0,100); 
ctx.lineTo(400, 100); 
ctx.stroke(); 

Hy vọng rằng sẽ giúp.

+0

Đây là tham chiếu API về phương thức setLineDash: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash. Dường như nó được hỗ trợ từ IE 11 trở đi và trong tất cả các trình duyệt hiện đại khác – thenickdude

Các vấn đề liên quan