2013-03-13 235 views
21

我想在HTML5畫布上畫一些虛線。但我找不到有這樣的功能。畫布路徑只能繪製實線。人們試圖在CSS中使用一些邊框特徵(虛線,虛線)來繪製虛線,但它們只能是水平或垂直的。所以我陷入了這個問題。我還找到一個名爲RGraph的圖書館,它可以繪製虛線。但使用外部庫會使繪圖非常慢。那麼任何機構都有一個想法如何實現這一點?任何幫助將不勝感激。在HTML5畫布上繪製虛線?

+0

「使用外部庫將使圖紙很慢」 - 是什麼讓你說呢? – 2013-03-13 21:44:16

+1

我的隊友已經試圖用庫來繪製這些虛線。畫布上有大約20條線條,但對錶現有很大的影響。當用戶與畫布進行交互時,如果拖動畫布,則會看到相當明顯的延遲。重繪它們需要更長的時間。 – 2013-03-13 22:21:57

+0

http://en.wikipedia.org/wiki/Correlation_does_not_imply_causation - 這很可能是庫所使用的導致延遲的技術,而不是它被打包到庫中的事實。 – 2013-03-13 22:27:16

回答

4

繪圖虛線上帆布

線I提供這種向上作爲一個完整的解決方案,但作爲簡單的方法來繪製任意2點之間的點線(任意角度的線)。它吸引得非常快。

您可以修改它以適合您的虛線需求。繪製破折號不應明顯減慢繪圖速度。

這裏是代碼和一個小提琴: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

嗨@mar​​kE,非常感謝您展示此解決方案。但是,我們需要嘗試的線條不一定是直線。所以我認爲這個解決方案可能行不通。但是,謝謝你們一樣! – 2013-03-27 02:05:20

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這個偉大的作品。 – louisinhongkong 2013-11-12 12:55:56

+0

對於將來的讀者,下面的javadeveloper的答案有較低的分數,但不需要定義任何函數 - 它使用內置的setLineDash()方法。 – Seb 2016-03-03 17:28:19

+1

這需要被接受的答案 – 2017-08-12 02:59:12

14

這是創建虛線更簡單的方法:

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(); 

希望有所幫助。

+0

以下是關於setLineDash方法的API參考:https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash。很明顯,它支持IE 11以及其他所有瀏覽器 – thenickdude 2016-02-29 01:38:03