2013-03-15 121 views
0

我在保留畫布上的一個對象時遇到問題。最初繪製箱渲染它在正確的位置,但它消失時,我將它拖到:已移動html5畫布上已繪製的形狀

var canvas = document.getElementById('canvas'), 
    context = canvas.getContext('2d'), 
    eraseAllButton = document.getElementById('eraseAllButton'), 
    strokeStyleSelect = document.getElementById('strokeStyleSelect'), 
    guidewireCheckbox = document.getElementById('guidewireCheckbox'), 
    drawingSurfaceImageData, 
    mousedown = {}, 
    rubberbandRect = {}, 
    dragging = false, 
    guidewires = guidewireCheckbox.checked, 
    w = 90, h = 90; 
    count = 0; 
    boxesXCo = 0; 
    boxesYCo = 0; 
    i = 0; 

// Functions.......................................................... 
function drawGrid(color, stepx, stepy) { 
    context.save() 

    context.strokeStyle = color; 
    context.lineWidth = 0.5; 
    context.clearRect(0, 0, context.canvas.width, context.canvas.height); 

    for (var i = stepx + 0.5; i < context.canvas.width; i += stepx) { 
    context.beginPath(); 
    context.moveTo(i, 0); 
    context.lineTo(i, context.canvas.height); 
    context.stroke(); 
    } 

    for (var i = stepy + 0.5; i < context.canvas.height; i += stepy) { 
    context.beginPath(); 
    context.moveTo(0, i); 
    context.lineTo(context.canvas.width, i); 
    context.stroke(); 
    } 

    context.restore(); 
} 

function windowToCanvas(x, y) { 
    var bbox = canvas.getBoundingClientRect(); 
    return { x: x - bbox.left * (canvas.width/bbox.width), 
      y: y - bbox.top * (canvas.height/bbox.height) }; 
} 

// Save and restore drawing surface................................... 
function saveDrawingSurface() { 
    drawingSurfaceImageData = context.getImageData(0, 0, 
          canvas.width, 
          canvas.height); 
} 

function restoreDrawingSurface() { 
    context.putImageData(drawingSurfaceImageData, 0, 0); 
} 


function drawRubberbandShape(loc) { 
    context.beginPath(); 
    context.moveTo(mousedown.x, mousedown.y); 
    //context.lineTo(loc.x, loc.y); 

    context.stroke(); 
} 

function updateRubberband(loc) { 
    //updateRubberbandRectangle(loc); 
    context.restore(); 
    drawRubberbandShape(loc); 
} 

// Guidewires......................................................... 
function drawHorizontalLine (y) { 
    context.beginPath(); 
    context.moveTo(0,y+0.5); 
    context.lineTo(context.canvas.width,y+0.5); 
    context.stroke(); 
} 

function drawVerticalLine (x) { 
    context.beginPath(); 
    context.moveTo(x+0.5,0); 
    context.lineTo(x+0.5,context.canvas.height); 
    context.stroke(); 
} 

function drawGuidewires(x, y) { 
    context.save(); 
    context.strokeStyle = 'rgba(0,0,230,0.4)'; 
    context.lineWidth = 0.5; 
    drawVerticalLine(x); 
    drawHorizontalLine(y); 
    context.restore(); 
} 

// Canvas event handlers.............................................. 
canvas.onmousedown = function (e) { 
    var loc = windowToCanvas(e.clientX, e.clientY); 

    e.preventDefault(); // prevent cursor change 
    context.restore(); 
    saveDrawingSurface(); 
    mousedown.x = loc.x; 
    mousedown.y = loc.y; 
    dragging = true; 
    if (i ==0) 
    i++; 
    else if(((mousedown.x<=(boxesXCo+w)&&(mousedown.x>=boxesXCo))&& 
        ((mousedown.y<=(boxesYCo+h)&&(mousedown.y>=boxesYCo))))) 
    i--; 

}; 

canvas.onmousemove = function (e) { 
    var loc; 

    if (dragging) { 
     e.preventDefault(); // prevent selections 

     loc = windowToCanvas(e.clientX, e.clientY); 
     restoreDrawingSurface(); 
     //updateRubberband(loc); 

     if(guidewires) { 
     drawGuidewires(loc.x, loc.y); 
     } 
    } 

    if(((mousedown.x<=(boxesXCo+w)&&(mousedown.x>=boxesXCo))&& 
        ((mousedown.y<=(boxesYCo+h)&&(mousedown.y>=boxesYCo)))) 
    && (dragging)&&(i == 1)){ 
     context.restore(); 
     restoreDrawingSurface(); 
     context.fillStyle = strokeStyleSelect.value; 
     context.fillRect(e.clientX,e.clientY,w,h); 


     }; 

    //Trying to implement moving shapes but need to store values of drawn objs 

}; 

canvas.onmouseup = function (e) { 
    loc = windowToCanvas(e.clientX, e.clientY); 
    restoreDrawingSurface(); 
    updateRubberband(loc); 
    dragging = false; 


     if(i == 0); 
     else { 
     saveDrawingSurface(); 
     restoreDrawingSurface(); 
     context.fillRect(e.clientX,e.clientY, w, h); 
     boxesXCo = e.clientX; 
     boxesYCo = e.clientY; 

     context.restore(); 
     i++;} 

     /*else if(i == 1) 
     { 
     context.restore(); 
     }*/ 




    //context.fillRect(mousedown.x,mousedown.y,w,h,"FF0982"); 
}; 

// Controls event handlers....................................... 

eraseAllButton.onclick = function (e) { 
    context.clearRect(0, 0, canvas.width, canvas.height); 
    drawGrid('lightgray', 10, 10); 
    saveDrawingSurface(); 
    count =0; 
    context.restore(); 
}; 

strokeStyleSelect.onchange = function (e) { 
    context.strokeStyle = strokeStyleSelect.value; 
    context.fillStyle = strokeStyleSelect.value; 
}; 

guidewireCheckbox.onchange = function (e) { 
    guidewires = guidewireCheckbox.checked; 
}; 

// Initialization................................................ 
context.strokeStyle = strokeStyleSelect.value; 
context.fillStyle = strokeStyleSelect.value; 
drawGrid('lightgray', 10, 10); 


//context.fillRect(mousedown.x,mousedown.y,(mousedown.x+50),(mousedown.x+50),"FF0982"); 
//context.drawRect(mousedown.x-50,mousedown.y-50,mousedown.x+50,mousedown.y+50); 

感謝名單再次

回答

0

而不是繪圖畫布上的每個鼠標移動,使用window.requestFrameAnimation不斷吸取。

在猜測,我會假設瀏覽器呈現干擾或座標已經出來,但我不能運行你的代碼來確保。

我寫了一些僞代碼,顯示我爲渲染事情做了些什麼。你需要自己實現這個功能,它不會用完,它只是作爲指導。

var Box = function() { 
}; 
Box.prototype = { 
    x: 0, 
    y: 0, 
    draw: function (canvas) { 
     // draw the item on the canvas 
    } 
}; 

var box = new Box(); 

window.requestAnimationFrame(function() { 
    box.draw(canvas); 
    window.requestAnimationFrame(); 
}); 

canvas.onmousemove = function(e) { 
    if (dragging) { 
     box.x = e.clientX; 
     box.y = e.clientY; 
    } 
}