html 开始绘制 切换方向 全部清空 开始绘制 切换方向 全部清空 js (function ($) {var drawLinePlug = function (ele,opts) {this.$ele = ele;this.default = {$start : null,$checkDeriction : null,$clear : null,$cxt : null,$cal
js开始绘制 切换方向 全部清空 开始绘制 切换方向 全部清空
(function ($) { var drawLinePlug = function (ele,opts) { this.$ele = ele; this.default = { $start : null, $checkDeriction : null, $clear : null, $cxt : null, $callBack: function (res) { return res; } }; this.options = $.extend({}, this.default, opts); this.ctx = document.getElementById(this.options.$cxt).getContext("2d"); this.ctx.strokeStyle = "#f00";//颜色 this.ctx.lineWidth = 3;//线条粗细 this.obj = {}; } drawLinePlug.prototype = { isDrew: false, deriction: -1, init: function () { var self = this; var options = self.options; options.$start.on('click', function (e) { self.isDrew = !self.isDrew; if (!!self.isDrew) { self.$ele.addClass("arr").removeClass("default"); $(this).text("结束绘制"); self.startPoint(); } else { self.$ele.addClass("default").removeClass("arr"); $(this).text("开始绘制"); self.drawArrow({x: self.obj.sx,y: self.obj.sy},{x: self.obj.ex,y: self.obj.ey},self.deriction); self.offDrawMove(); self.offStartPoint(); } }); self.dbClick(); self.clearCanvas(); self.checkDeriction(); }, startPoint:function () { var self = this; self.$ele.on('click',function (e) { self.drawMove(e.offsetX, e.offsetY); self.$ele.off('click'); }) }, clearCanvas: function () { var self = this; var options = self.options; options.$clear.on('click',function () { self.ctx.clearRect(0, 0, 400, 400); self.obj = {}; }) }, checkDeriction: function () { var self = this; var options = self.options; options.$checkDeriction.on('click',function () { if (!!self.obj) { self.deriction = (self.deriction === -1) ? 1 : -1; self.drawLine(self.obj.sx,self.obj.sy,self.obj.ex,self.obj.ey); self.drawArrow({x: self.obj.sx,y: self.obj.sy},{x: self.obj.ex,y: self.obj.ey},self.deriction); } }) }, offDrawMove:function () { this.$ele.off('mousemove'); }, offStartPoint: function () { this.$ele.off('click'); }, drawMove: function (sx,sy) { var self = this; self.$ele.on('mousemove' ,function (e) { if (!!self.isDrew) { self.drawLine(sx, sy, e.offsetX, e.offsetY); } }); }, dbClick: function () { var self = this; var options = self.options; self.$ele.on('dblclick', function () { if (!!self.isDrew) { self.offDrawMove(); self.offStartPoint(); self.isDrew = false; self.$ele.addClass("default").removeClass("arr"); options.$start.text("开始绘制"); self.drawArrow({x: self.obj.sx,y: self.obj.sy},{x: self.obj.ex,y: self.obj.ey},self.deriction); } }) }, drawArrow: function(beginPoint, endPoint, flag) { var angle = Math.atan2(endPoint.y - beginPoint.y, endPoint.x - beginPoint.x) / Math.PI * 180, x3 = (14 * beginPoint.x + endPoint.x)/15, y3 = (14 * beginPoint.y + endPoint.y)/15, x4 = x3 - 30 * Math.cos(angle + 90), y4 = y3 + 30 * Math.sin(angle + 90); var arrow = []; arrow[0] = { x: x3, y: y3 }; arrow[7] = { x: x3 - 15 * Math.cos(Math.PI / 180 * (angle + 90)), y: y3 - 15 * Math.sin(Math.PI / 180 * (angle + 90)) }; arrow[8] = { x: x3 - 15 * Math.cos(Math.PI / 180 * (angle - 90)), y: y3 - 15 * Math.sin(Math.PI / 180 * (angle - 90)) }; arrow[1] = { x: (arrow[7].x + arrow[0].x) / 2, y: (arrow[7].y + arrow[0].y) / 2 }; arrow[2] = { x: (arrow[8].x + arrow[0].x) / 2, y: (arrow[8].y + arrow[0].y) / 2 }; arrow[3] = { x: arrow[1].x + 5 * Math.cos(angle * Math.PI / 180), y: arrow[1].y + 5 * Math.sin(angle * Math.PI / 180) }; arrow[4] = { x: arrow[1].x - 5 * Math.cos(angle * Math.PI / 180), y: arrow[1].y - 5 * Math.sin(angle * Math.PI / 180) }; arrow[5] = { x: arrow[2].x + 5 * Math.cos(angle * Math.PI / 180), y: arrow[2].y + 5 * Math.sin(angle * Math.PI / 180) }; arrow[6] = { x: arrow[2].x - 5 * Math.cos(angle * Math.PI / 180), y: arrow[2].y - 5 * Math.sin(angle * Math.PI / 180) }; this.ctx.strokeStyle = "#26e92e"; this.ctx.fillStyle = "#26e92e"; this.ctx.beginPath(); if (flag == 1) { this.obj.arrowStart={x:arrow[2].x, y:arrow[2].y}; this.obj.arrowEnd={x:arrow[7].x,y:arrow[7].y} this.obj.direction = (Math.ceil((angle) / 90)) % 4; this.ctx.moveTo(arrow[2].x, arrow[2].y); this.ctx.lineTo(arrow[1].x, arrow[1].y); this.ctx.lineTo(arrow[4].x, arrow[4].y); this.ctx.lineTo(arrow[7].x, arrow[7].y); this.ctx.lineTo(arrow[3].x, arrow[3].y); this.ctx.lineTo(arrow[1].x, arrow[1].y); } else if (flag == -1) { this.obj.arrowStart={x:arrow[1].x, y:arrow[1].y}; this.obj.arrowEnd={x:arrow[8].x,y:arrow[8].y} this.obj.direction = (Math.ceil((angle+180) / 90)) % 4; this.ctx.moveTo(arrow[1].x, arrow[1].y); this.ctx.lineTo(arrow[2].x, arrow[2].y); this.ctx.lineTo(arrow[5].x, arrow[5].y); this.ctx.lineTo(arrow[8].x, arrow[8].y); this.ctx.lineTo(arrow[6].x, arrow[6].y); this.ctx.lineTo(arrow[2].x, arrow[2].y); } this.ctx.closePath(); this.ctx.stroke(); this.ctx.fill(); this.ctx.strokeStyle = "#f00"; this.consoleInfo(); }, consoleInfo: function () { var options = this.options; (typeof (options.$callBack) === "function") && options.$callBack.call(this, this.obj); }, drawLine: function (sx, sy, ex, ey) { this.ctx.clearRect(0, 0, 400, 400);//clearRect() 方法清空给定矩形内的指定像素。 this.ctx.beginPath(); this.ctx.moveTo(sx, sy);//把路径移动到画布中的指定点,不创建线条 this.ctx.lineTo(ex, ey);//添加一个新点,然后在画布中创建从该点到最后指定点的线条 this.ctx.stroke();//stroke() 方法会实际地绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色。 this.obj.sx = sx; this.obj.sy = sy; this.obj.ex = ex; this.obj.ey = ey; } }; $.fn.drawLineArr = function(options) { var newDraw = new drawLinePlug(this, options); return newDraw.init(); } })(jQuery);箭头线.rar 箭头线.rar 1.gif