KineticJS – draw lines using mouse tutorial
In this post we will see how to draw lines using mouse with KineticJS canvas library. First we will go through a basic logic for drawing line. Also we will see how this logic can be implemented for KineticJS.
Logic for drawing line on canvas using mouse
- Listen for mousedown, mousemove, mouseup events on canvas
- on mousedown
store x1, y1 relative to canvas element
set started = true - on mousemove
if started = false then exit
get current x, y
element = line(x1, y1, x, y) - on mouseup
if started = false then exit
get current x, y
element = line(x1, y1, x, y)
Add following div into body
<div id="canvasArea"> </div>Initialize a stage and layers
var stage = new Kinetic.Stage({ container: 'canvasArea', width: 500, height: 500, draggable: false }), layer = new Kinetic.Layer({ name: 'layer' }), tmpLayer = new Kinetic.Layer({ name: 'tmpLayer' });In above code you can see two layers are initialized. Now you must be thinking about what is the need of 2nd layer if single layer is sufficient. One extra layer that is “tmpLayer” is used for real-time drawing of the element on canvas using mouse.
This is because “layer” will hold multiple objects and if we want to show real-time drawing line then we have to remove/modify that line and redraw the “layer” again on every mouse move to show effect. This will be expensive operation as other shapes are there on “layer” already and they will be redrawn as well unnecessarily. So to avoid this we have added “tmpLayer” to show real-time line drawing which will be added in mousedown event and will be removed in mouseup event .
Add layer into stage
stage.add(layer);Initialize events for canvas
$('#canvasArea .kineticjs-content').on('mousedown', tool.line_mousedown);
$('#canvasArea .kineticjs-content').on('mousemove', tool.line_mousemove); $('#canvasArea .kineticjs-content').on('mouseup', tool.line_mouseup);Mousedown callback function
tool.line_mousedown = function(evt) { console.log('line_mousedown'); //store start point relative to canvas tool.startPoint = getRelativePointerPosition(); //set started flag to true tool.started = true; //add temporary layer to stage stage.add(tmpLayer); };Above started flag has been set to true and x,y co-ordinate of mouse is stored as a startPoint upon mousedown event. Also “tempLayer” is now added to stage.
Mousemove callback function
tool.line_mousemove = function(evt) { //if drawing of tool (line) is not started then exit if(!tool.started) { return; } //get x,y co-ordinate relative to canvas var tempPoint = getRelativePointerPosition(); if(tempPoint !== undefined && tool.startPoint !== undefined) { //create kinetic line instance var tmpLine = new Kinetic.Line({ points: [tool.startPoint.x, tool.startPoint.y, tempPoint.x, tempPoint.y], stroke: '#C00000', strokeWidth: 1 }); //remove previous line off temporary layer tmpLayer.removeChildren(); //add current line to temporary canvas tmpLayer.add(tmpLine); //draw temporary layer to draw previously added line instance tmpLayer.draw(); } };In above snippet upon mousemove event we are checking if line drawing has been started or not with “tool.started” flag. “tempPoint” will have x,y co-ordinate relative to canvas element. Next inside if-condition we are creating an instance of Kinetic.Line class as “tmpLine”. Before adding it into “tmpLayer” we are first removing all shapes on that layer with method “removeChildren”. After adding “tmpLine” into “tmpLayer” we are calling “draw” method of “tmpLayer” which will draw “tmpLine” and this will happen as we move mouse holding mouse button.
Mouseup callback function
tool.line_mouseup = function(evt) { if (tool.started) { //get x,y co-ordinate relative to canvas var tempPoint = getRelativePointerPosition(); if(tempPoint !== undefined && tool.startPoint !== undefined) { //create kinetic line instance var tmpLine = new Kinetic.Line({ points: [tool.startPoint.x, tool.startPoint.y, tempPoint.x, tempPoint.y], stroke: '#C00000', strokeWidth: 1 }); //destroy temporary layer tmpLayer.destroy(); //add previously created line instance to main layer layer.add(tmpLine); //draw layer to draw previously added line instance layer.draw(); } //set started flag to false tool.started = false; } };Mouseup event callback function is same as mousemove function except for adding line to the layer. This is the final step in which we will destroy “tmpLayer” which we added in “mousedown” function and will add Kinetic.Line instance on to “layer” which is main layer for this case.
I am planning to add drawing of different shapes using mouse on canvas in coming posts with different canvas libraries like fabricjs etc.
Comments
Post a Comment