fabricjs - Using fabric.js hovering lines is fired around them (not only exactely over them) -
i have made variation of stick man example allows move not circles, lines too. problem face hovering inclined lines area affect line not exact line, space around it, too.
to see problem:
- move circle achieve line not horizontal or vertical
- try move line
te result: see posible not exactely on line.
//to save old cursor position: used on line mooving var _curx, _cury; $(function() { //create fabriccanvas object & disable canvas selection var canvas = new fabric.canvas('c', { selection: false }); //move objects origin of transformation center fabric.object.prototype.originx = fabric.object.prototype.originy = 'center'; function makecircle(left, top, line1, line2) { var c = new fabric.circle({ left: left, top: top, strokewidth: 2, radius: 6, fill: '#fff', stroke: '#666' }); c.hascontrols = c.hasborders = false; c.line1 = line1; c.line2 = line2; return c; } function makeline(coords, name) { var l = new fabric.line(coords, { stroke: 'red', strokewidth: 4, selectable: true, //false name: name }); l.hascontrols = l.hasborders = false; return l; } //initial shape information var line = makeline([250, 125, 350, 125], "l1"), line2 = makeline([350, 125, 350, 225], "l2"), line3 = makeline([350, 225, 250, 225], "l3"), line4 = makeline([250, 225, 250, 125], "l4"); canvas.add(line, line2, line3, line4); canvas.add( makecircle(line.get('x1'), line.get('y1'), line4, line), makecircle(line.get('x2'), line.get('y2'), line, line2), makecircle(line2.get('x2'), line2.get('y2'), line2, line3), makecircle(line3.get('x2'), line3.get('y2'), line3, line4) ); canvas.on('object:selected', function(e) { //find selected object type var objtype = e.target.get('type'); if (objtype == 'line') { _curx = e.e.clientx; _cury = e.e.clienty; //console.log(_curx); //console.log(_cury); } }); canvas.on('object:moving', function(e) { //find moving object type var p = e.target; var objtype = p.get('type'); if (objtype == 'circle') { p.line1 && p.line1.set({ 'x2': p.left, 'y2': p.top }); p.line2 && p.line2.set({ 'x1': p.left, 'y1': p.top }); //set coordinates lines - should done if element moved programmely p.line2.setcoords(); p.line1.setcoords(); canvas.renderall(); } else if (objtype == 'line') { var _curxm = (_curx - e.e.clientx); var _curym = (_cury - e.e.clienty); //console.log("moved: " + _curxm); //console.log("moved: " + _curym); //loop circles , if contains line - move (var = 0; < canvas.getobjects('circle').length; i++) { var currentobj = canvas.getobjects('circle')[i]; if (currentobj.line1.get("name") == p.get('name') || currentobj.line2.get("name") == p.get('name')) { currentobj.set({ 'left': (currentobj.left - _curxm), 'top': (currentobj.top - _curym) }); currentobj.setcoords(); currentobj.line1 && currentobj.line1.set({ 'x2': currentobj.left, 'y2': currentobj.top }); currentobj.line2 && currentobj.line2.set({ 'x1': currentobj.left, 'y1': currentobj.top }); currentobj.line2.setcoords(); currentobj.line1.setcoords(); } } _curx = e.e.clientx; _cury = e.e.clienty; } }); });
canvas { border: 1px solid #808080; }
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <canvas id="c" width="500" height="500"></canvas>
inside function makeline
please add perpixeltargetfind: true
new fabric.line
.
i made jsfiddle
Comments
Post a Comment