2014-03-24 3 views
0

Скажем, я хочу нарисовать прямоугольник на холсте. Я хочу получить координаты от мыши пользователя. Идеальный сценарий - это щелчок пользователя в точке и перетаскивание вниз на другой конец, как те прямоугольники, которые мы рисуем с помощью краски. Как я могу нарисовать прямоугольник, как в краске, перетаскивая мышь? (Как получить координаты мыши, когда он щелкает мышью и уходит в?)Как нарисовать прямоугольник на холсте, как мы делаем на краске?

ответ

1

Вот набросок того, как перетащить нарисовать прямоугольник на холсте:

В MouseDown:

  • сохранить стартовую позицию мыши
  • установить флаг, указывающий сопротивление начал

В муссоне:

  • ясно, полотно предыдущего прямоугольника
  • вычислить прямоугольник ширина/высота в пересчете на исходный против текущей позиции мыши
  • нарисовать прямоугольник из исходного XY текущей позиции мыши

В MouseUp:

  • ясно перетягивания флаг, потому что перетаскивание над

Вот е Xample код и демо: http://jsfiddle.net/m1erickson/6E2yd/

<!doctype html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 

<style> 
    body{ background-color: ivory; } 
    #canvas{border:1px solid red;} 
</style> 

<script> 
$(function(){ 

    // get references to the canvas and context 
    var canvas=document.getElementById("canvas"); 
    var ctx=canvas.getContext("2d"); 

    // style the context 
    ctx.strokeStyle = "blue"; 
    ctx.lineWidth=3; 

    // calculate where the canvas is on the window 
    // (used to help calculate mouseX/mouseY) 
    var $canvas=$("#canvas"); 
    var canvasOffset=$canvas.offset(); 
    var offsetX=canvasOffset.left; 
    var offsetY=canvasOffset.top; 
    var scrollX=$canvas.scrollLeft(); 
    var scrollY=$canvas.scrollTop(); 

    // this flage is true when the user is dragging the mouse 
    var isDown=false; 

    // these vars will hold the starting mouse position 
    var startX; 
    var startY; 


    function handleMouseDown(e){ 
     e.preventDefault(); 
     e.stopPropagation(); 

     // save the starting x/y of the rectangle 
     startX=parseInt(e.clientX-offsetX); 
     startY=parseInt(e.clientY-offsetY); 

     // set a flag indicating the drag has begun 
     isDown=true; 
    } 

    function handleMouseUp(e){ 
     e.preventDefault(); 
     e.stopPropagation(); 

     // the drag is over, clear the dragging flag 
     isDown=false; 
    } 

    function handleMouseOut(e){ 
     e.preventDefault(); 
     e.stopPropagation(); 

     // the drag is over, clear the dragging flag 
     isDown=false; 
    } 

    function handleMouseMove(e){ 
     e.preventDefault(); 
     e.stopPropagation(); 

     // if we're not dragging, just return 
     if(!isDown){return;} 

     // get the current mouse position 
     mouseX=parseInt(e.clientX-offsetX); 
     mouseY=parseInt(e.clientY-offsetY); 

     // Put your mousemove stuff here 

     // clear the canvas 
     ctx.clearRect(0,0,canvas.width,canvas.height); 

     // calculate the rectangle width/height based 
     // on starting vs current mouse position 
     var width=mouseX-startX; 
     var height=mouseY-startY; 

     // draw a new rect from the start position 
     // to the current mouse position 
     ctx.strokeRect(startX,startY,width,height); 

    } 

    // listen for mouse events 
    $("#canvas").mousedown(function(e){handleMouseDown(e);}); 
    $("#canvas").mousemove(function(e){handleMouseMove(e);}); 
    $("#canvas").mouseup(function(e){handleMouseUp(e);}); 
    $("#canvas").mouseout(function(e){handleMouseOut(e);}); 

}); // end $(function(){}); 
</script> 
</head> 
<body> 
    <h4>Drag the mouse to create a rectangle</h4> 
    <canvas id="canvas" width=300 height=300></canvas> 
</body> 
</html> 
  • ясно
+0

"Uncaught TypeError: Невозможно прочитать свойство" left 'of undefined ". Это ошибка его отображения. На самом деле холст, который я пытаюсь использовать, находится в iframe. Так что я предполагаю, что нам нужно получить доступ к id элемента canvas, который находится в другой DOM. Пожалуйста, будьте добры, чтобы изменить свой код в соответствии с ним и отправить его. Ценю вашу помощь. – user3454558

+0

Вам нужно будет опубликовать свой html для получения ссылок от ;-) – markE

+0

Хорошо, я понял. Ваш ответ работает. Спасибо. – user3454558

0

с помощью этой функции вы можете получить mousecoordinates

function getMousePos(canvas, evt) { 
    var rect = canvas.getBoundingClientRect(); 
    return { 
     x: evt.clientX - rect.left, 
     y: evt.clientY - rect.top 
    }; 
    } 

эта функция принимает в объекте холст и события. Теперь вам просто нужно добавить eventHandler на mousedown и mouseup, и вы можете получить оба места.

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

var locA, locB; 

document.addEventListener('mousedown', function(e) { 
    e.preventDefault(); 
    locA = getMousePos(canvas, e); 
}); 

document.addEventListener('mouseup', function(e) { 
    e.preventDefault(); 
    locB = getMousePos(canvas, e); 

    ctx.fillStyle = '#000000'; 
    ctx.fillRect(locA.x, locA.y, (locB.x - locA.x), (locB.y - locA.y)); 
}); 

функция источник: http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/

Есть еще некоторые проблемы, связанные холст координата против координат документа, но я уверен, что вы будете в состоянии исправить.

+0

его показ Loca не определен. – user3454558

Смежные вопросы