UNPKG

test-whiteboard

Version:

https://gitlab.gridsum.com/gov_law_tech/FrontEnd/whiteboard

268 lines (199 loc) 7.78 kB
import EventEmitter from './eventEmitter'; import Viewer from './viewer' export default class Whiteboard{ constructor(elelment){ this.root = elelment; /** for(var i=0;i<this.root.childNodes.length;i++) { if(this.root.childNodes[i].nodeType!=1) { continue; } if(this.root.childNodes[i].getAttribute('class').indexOf('main-board')!=-1) { this.canvas=this.root.childNodes[i]; } else if(this.root.childNodes[i].getAttribute('class').indexOf('draw-text')!=-1) { this.textElement=this.root.childNodes[i]; } else if(this.root.childNodes[i].getAttribute('class').indexOf('img-container')!=-1) { this.imageElement = this.root.childNodes[i]; } } ***/ this.emitter = new EventEmitter(); } init (role) { console.log('whiteboard init -- ') this.role = role; var me = this; var root = me.root; var bound = root.getBoundingClientRect(); var width = bound.width; var height =bound.height; //创建dom结构 var canvas = document.createElement('canvas'); canvas.setAttribute('name','main-canvas'); canvas.setAttribute('class','whiteboard-item main-board'); canvas.setAttribute('width',(width+20)+'px'); canvas.setAttribute('height',(height+20)+'px'); //canvas.setAttribute('style','border:solid 2px #f00;z-index:9999;cursor:move;'); root.append(canvas); this.canvas = canvas; //如果是查看状态,禁止操作 if(!(role instanceof Viewer)) { this.canvas.addEventListener('mousemove',function (e) { if(!me.role.drawers['line'].canvasTransform.canMove && e.button!=1 ) { return; } console.log('canvas move2 ') // me.role.drawers['line'].reDrawLine() // 拖动完,把第一个的矩阵给第二个 var newMatrix = Object.assign({},me.role.drawers['line'].canvasTransform.matrix) var imgCanvas = me.role.drawers['image'].canvas var imgCtx = me.role.drawers['image'].canvasTransform.context; imgCtx.clearRect(-5, -5, imgCanvas.width+10, imgCanvas.height+10); imgCtx.setTransform.apply(imgCtx,newMatrix); me.role.drawers['image'].canvasTransform.__drawSelf(); me.role.drawers['image'].canvasTransform.matrix['0'] = newMatrix['0'] me.role.drawers['image'].canvasTransform.matrix['1'] = newMatrix['1'] me.role.drawers['image'].canvasTransform.matrix['2'] = newMatrix['2'] me.role.drawers['image'].canvasTransform.matrix['3'] = newMatrix['3'] me.role.drawers['image'].canvasTransform.matrix['4'] = newMatrix['4'] me.role.drawers['image'].canvasTransform.matrix['5'] = newMatrix['5'] // console.log('line matrix--',me.role.drawers['line'].canvasTransform.matrix) // console.log('image matrix--',me.role.drawers['image'].canvasTransform.matrix) }) } var textContainer = document.createElement('div'); textContainer.setAttribute('class','whiteboard-item item-box draw-text'); root.append(textContainer); this.textElement = textContainer; var imageContainer = document.createElement('div'); imageContainer.setAttribute('class','whiteboard-item item-box img-container'); root.append(imageContainer); this.imageElement = imageContainer; var messageBox = document.createElement('div'); messageBox.setAttribute('class','whiteboard-item message-box'); messageBox.setAttribute('style','display:none'); root.append(messageBox); this.messageBox = messageBox; me.role.container={ imageElement:this.imageElement, canvas:this.canvas, textElement:this.textElement }; me.role.init(); this.on('notify_waitLoading',function () { messageBox.setAttribute('style','display:block'); messageBox.innerText='正在加载图片'; }); this.on('notify_loadSuccess',function () { messageBox.setAttribute('style','display:none'); messageBox.innerText=''; }); this.on('notify_loadError',function () { messageBox.setAttribute('style','display:block'); messageBox.innerText='加载图片出错,格式不正确'; }); this.on('action_resetBox',function (width,height) { me.resetBox(width,height); }); } resetBox(width,height){ this.textElement.style.width = width+'px'; this.textElement.style.height = height+'px'; this.imageElement.style.width = width+'px'; this.imageElement.style.height = height+'px'; this.messageBox.style.width = width+'px'; this.messageBox.style.height = height+'px'; this.canvas.setAttribute('width',width+'px'); // 改变canvas宽高,画布内容会清空 this.canvas.setAttribute('height',height+'px'); var ctx = this.canvas.getContext('2d'); // var grd=ctx.createLinearGradient(0,0,175,50); // grd.addColorStop(0,"#FF0000"); // grd.addColorStop(1,"#00FF00"); // ctx.fillStyle=grd; // ctx.fillStyle = '#FF0' // ctx.fillRect(10,250,300,50); // ctx.strokeStyle = "red"; //第四步:绘制矩形,只有线。内容是空的 // ctx.strokeRect(10, 10, width-20, height-20); this.role.drawers['line'].canvasTransform.drawCanvas(this.canvas) } //清除后,全部重新初始化 destroy(){ let me = this; while(this.root.childNodes.length>0) { this.root.removeChild(this.root.childNodes[0]); } this.role = null; this.canvas=null; this.textElement = null; this.imageElement = null; this.messageBox = null; } changeMode (currentMode, changeMove) { this.role.changeMode(currentMode, changeMove); } /*** * 1放大 2 缩小 3 逆时针旋转 4 顺时针旋转 5 文字标注 6 划线标注 7 撤销上一步 * @param type */ action(type){ this.role.action(type); } on (key,fn) { var me = this; var item = me.role.eventDic.filter(function (item) { return item==key; }); if(item.length!=0) { me.role.on(key,fn); } else{ me.emitter.on(key,fn); } } emit (key,args) { var me = this; var item = me.role.eventDic.filter(function (item) { return item==key; }); if(item.length!=0) { me.role.emit(key,args); } else{ me.emitter.emit(key,args); } } getCanvasImage(imgElement){ let canvas = this.canvas; imgElement.src=canvas.toDataURL("image/png"); } getBlob() { function dataURLtoBlob(dataurl) { var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], {type:mime}); } var dataurl = this.canvas.toDataURL('image/png'); var blob = dataURLtoBlob(dataurl); return blob; } drawPaint(img){ this.role.drawPaint(img); } }