2013-12-12 80 views
2

所以我想做一條線跟隨鼠標,並點擊繪製該線,我需要這個繪製多邊形。我的想法是每次鼠標移動時畫一條線,但隨後會弄亂很多線條,所以我決定在用白色線條移動鼠標並清理之後,畫出過去的線條,這樣只會有一條線條出現從最後一次點擊到當前鼠標位置。 My jsFiddle for this.,但它不工作的方式,我想是的,我在點擊繪製多邊形,但沒有線跟隨鼠標,所以我不能看到我正在繪製的線。我不明白哪裏錯了?也許有一些現成的解決方案,我沒有找到?我的代碼:html canvas一條線跟隨鼠標

var polygonX = []; 
    var polygonY = []; 
    var lineReady = 0; 
    var whileLineX; 
    var whiteLineY; 

    $("#body").bind('mousemove', function (ev) { 
     if (lineReady >= 2) { 

     var context; 
     //clear old lines 
     if (whiteLineX !== null && whiteLineY !== null) { 
      context = $("#canvas")[0].getContext('2d'); 
      context.moveTo(polygonX[lineReady - 1], polygonY[lineReady - 1]); 
      context.lineTo(whiteLineX, whiteLineY); 
      context.strokeStyle = '#ffffff'; 
      context.stroke(); 
     } 
     //draw a new line 
     context = $("#canvas")[0].getContext('2d'); 
     var offset = $('#body').offset(); 
     var x = ev.clientX - offset.left; 
     var y = ev.clientY - offset.top; 

     context.beginPath(); 
     context.moveTo(polygonX[lineReady - 1], polygonY[lineReady - 1]); 
     context.strokeStyle = '#000000'; 
     context.lineTo(x, y); 
     context.stroke(); 

     whileLineX = x; 
     whiteLineY = y; 

    } 
}); 


    $("#body").bind('click', function (ev) { 

     var offset = $('#body').offset(); 
     var x = ev.clientX - offset.left; 
     var y = ev.clientY - offset.top; 

     polygonX 

.push(x); 
    polygonY.push(y); 

    lineReady++; 
    if (lineReady >= 2) { 

     var context = $("#canvas")[0].getContext('2d'); 

     context.beginPath(); 
     context.moveTo(polygonX[lineReady - 2], polygonY[lineReady - 2]); 
     context.lineTo(polygonX[lineReady - 1], polygonY[lineReady - 1]); 
     context.stroke(); 

    } 

});` 
+0

無論何時鼠標移動到上方,使用z-index使用兩個畫布, ,然後清除整個畫布並從源繪製一條線到該鼠標位置。一旦鼠標被釋放,從畫布下面的源代碼到目的地的行再次擦除上面的那個 – Shadow

回答

2

最好的方法是使用一點動畫。

每當您繪製一條線時,將其座標(第一個點和最後一個點)推入一個數組中。然後在每個動畫循環中畫出你的數組(查看this link,這將解釋你如何動畫) 。然後,您需要從數組的最後一行的最後一點繪製一條線,用紅線表示,將線條拖動到鼠標位置。

這樣做可以讓你在任何時候都有一條紅線跟隨你的鼠標,給你一條線的「預覽」。

ALGO明智它看起來像:

var arrayOflines = []; 

canvas.onclick -> 
    var coordinates = mouseposition() 
    arrayOfLines.push(coordinates) 

function mouseposition(){ 
    returns x and y of your mouse on the canvas 
} 

function draw(array){ 
    loop through array 
    draw line from array[0] to array[1], then from array[1] to array[2] on canvas 
} 

function drawPreview(){ 
    draw line from last point of arrayOflines to mouseposition; 
} 

//so here we are: 
function animationloop{ 

    erase your canvas 

    draw(arrayOfLines); //draw your array 
    drawPreview(); //draw your 'preview' line 

    requestAnimationFrame(animationloop); //animate 
} 

這樣做,讓將讓你獲得清晰​​的結果。

+0

你的意思是「擦掉你的畫布」是什麼意思?清除它?創建一個新的並用預覽畫出新的一行? – user3074343

+0

在做動畫的時候,你會想把所有東西都當成一個循環:清除那裏的東西,做一些新的事情,抹去那裏的東西,做一些新的事情。在繪製新東西之前,只需繪製一個佔據所有畫布的矩形即可! –

+1

這個例子來自你提供的鏈接,我做了我想要的[小提琴](http://jsfiddle.net/dFjodorov/XQpzU/5171/)。 thx – user3074343