[英]I am trying to draw a line and rectangle on canvas using mouse events in JCanvas
[英]I am trying to draw a line on canvas by using mouse events
我正在嘗試使用mousedown
, mousemove
, mouseup
事件在畫布上畫一條線,但是我無法設置在Canvas上畫線的坐標。 在這里,我使用以下JavaScript代碼:
function line()
{
canvas = document.getElementById("drawingCanvas");
context = canvas.getContext("2d");
canvas.onmousedown = startLine;
canvas.onmouseup = drawLine;
canvas.onmouseout = stopLine;
//canvas.onmousemove =drawLine;
};
function startLine(e)
{
isLine = true;
context.beginPath();
context.moveTo(e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop);
}
function drawLine(e)
{
if (isLine==true)
{
var x = e.pageX - canvas.offsetLeft;
var y = e.pageY - canvas.offsetTop;
context.lineTo(x ,y);
context.stroke();
context.closePath();
}
cPush();
}
function stopLine()
{
isLine = false;
}
當我將mousemove
事件用於drawLine()
方法時,它正在繪制多條線。 您能告訴我我的代碼有什么問題嗎?
基本上,您需要重構代碼以在mousemove內部執行beginPath + moveTo + lineTo + stroke。
否則,您將獲得這些多行...
在mouseDown中:保存startX / startY並設置isDown標志以指示拖動已開始:
function handleMouseDown(e){
e.preventDefault();
startX=parseInt(e.clientX-offsetX);
startY=parseInt(e.clientY-offsetY);
isDown=true;
}
在mouseMove中:從startX / Y到mouseX / Y畫一條新線,並重置startX / Y = mouseX / Y
function handleMouseMove(e){
if(!isDown){return;}
e.preventDefault();
mouseX=parseInt(e.clientX-offsetX);
mouseY=parseInt(e.clientY-offsetY);
ctx.beginPath(); // use beginPath for every segment of the line
ctx.moveTo(startX,startY);
ctx.lineTo(mouseX,mouseY);
ctx.stroke();
startX=mouseX;
startY=mouseY;
}
在mouseUP中:清除isDown標志以指示拖動已結束:
function handleMouseUp(e){
e.preventDefault();
isDown=false;
}
這是代碼和小提琴: http : //jsfiddle.net/m1erickson/hzNg4/
<!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(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var $canvas=$("#canvas");
var canvasOffset=$canvas.offset();
var offsetX=canvasOffset.left;
var offsetY=canvasOffset.top;
var scrollX=$canvas.scrollLeft();
var scrollY=$canvas.scrollTop();
var isDown=false;
var startX;
var startY;
function handleMouseDown(e){
e.preventDefault();
startX=parseInt(e.clientX-offsetX);
startY=parseInt(e.clientY-offsetY);
isDown=true;
}
function handleMouseUp(e){
e.preventDefault();
isDown=false;
}
function handleMouseOut(e){
e.preventDefault();
mouseX=parseInt(e.clientX-offsetX);
mouseY=parseInt(e.clientY-offsetY);
isDown=false;
}
function handleMouseMove(e){
if(!isDown){return;}
e.preventDefault();
mouseX=parseInt(e.clientX-offsetX);
mouseY=parseInt(e.clientY-offsetY);
// Put your mousemove stuff here
ctx.beginPath();
ctx.moveTo(startX,startY);
ctx.lineTo(mouseX,mouseY);
ctx.stroke();
startX=mouseX;
startY=mouseY;
}
$("#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>
<canvas id="canvas" width=300 height=300></canvas>
</body>
</html>
嘗試這種方式( DEMO ):
function line() {
canvas = document.getElementById("drawingCanvas");
context = canvas.getContext("2d");
canvas.onmousedown = startLine;
canvas.onmouseup = canvas.onmouseout = stopLine;
canvas.onmousemove = drawLine;
};
function startLine(e) {
isLine = true;
context.beginPath();
context.moveTo(startX = (e.pageX - canvas.offsetLeft),
startY = (e.pageY - canvas.offsetTop));
}
function drawLine(e) {
if (isLine) {
var x = e.pageX - canvas.offsetLeft;
var y = e.pageY - canvas.offsetTop;
context.clearRect(0, 0, 300, 150); // width = 300, height = 150
context.beginPath();
context.moveTo(startX, startY);
context.lineTo(x, y);
context.stroke();
context.closePath();
}
//cPush();
}
function stopLine() {
isLine = false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.