基于html5二个div 连线
<p><br><img src="http://dl.iteye.com/upload/attachment/0075/5037/8e381798-1fc6-3f0a-adc7-087e6f9aee3b.jpg"></p><p> </p>
<p><br><img src="http://dl.iteye.com/upload/attachment/0075/5039/dada324d-cd01-31a1-ab96-b77d7e97043c.jpg"></p>
<p> 因为要实现拖拽连线研究了一下基于extjs 和html5的不同实现方法</p>
<p>extjs底层的画图引擎是svg 不知道在html5大潮即将袭来的前夕一贯走在技术前沿的extjs开发团队没有自己封装基于html5的画图引擎,而是选择了svg 。</p>
<p> 下边是花了不到一天的时间实现的任意点连线和拖动功能,代码没有优化,稍微乱了点</p>
<p> 如果单纯应用canvas进行画图,拖拽是非常麻烦的,我们往往要基于第三方的画图类库,这里实现是基于kineticjs</p>
<p> 为了测试方便我使用了双击事件控制拖动还是划线 。</p>
<p> 代码</p>
<div id="" class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <img src="https://www.iteye.com/images/icon_star.png"></div>
</div>
<ol class="dp-c" start="1">
<li><!DOCTYPE HTML> </li>
<li><html> </li>
<li> <head> </li>
<li> <style> </li>
<li> body { </li>
<li> margin: 0px; </li>
<li> padding: 0px; </li>
<li> } </li>
<li> canvas { </li>
<li> border: 1px solid #9C9898; </li>
<li> } </li>
<li> </style> </li>
<li> <script type=<span class="string">"text/javascript" src=<span class="string">"ext/bootstrap.js"></script> </span></span></li>
<li> <!-- ENDLIBS --> </li>
<li> <script type=<span class="string">"text/javascript" src=<span class="string">"ext/ext-all-debug.js"></script> </span></span></li>
<li> <script src=<span class="string">"js/kinetic-v3.10.2.min.js"></script> </span></li>
<li> <script> </li>
<li> </li>
<li> Ext.onReady(<span class="keyword">function(){ </span></li>
<li> <span class="comment">/** </span></li>
<li><span class="comment"> 自动判断顶点连线算法 </span></li>
<li><span class="comment"> */ </span></li>
<li> </li>
<li> <span class="keyword">var stage=<span class="keyword">new Kinetic.Stage({ </span></span></li>
<li> container:<span class="string">'container', </span></li>
<li> width:1000, </li>
<li> height:1000 </li>
<li> }); </li>
<li> <span class="keyword">var layer=<span class="keyword">new Kinetic.Layer(); </span></span></li>
<li> <span class="keyword">var flag=<span class="keyword">false; </span></span></li>
<li> <span class="keyword">var imgArray=[]; </span></li>
<li> <span class="keyword">var lineArray=[]; </span></li>
<li> <span class="keyword">var tmpMoveImg=<span class="keyword">null; </span></span></li>
<li> <span class="keyword">var loop=0; </span></li>
<li> <span class="keyword">function Pos(x,y){ </span></li>
<li> <span class="keyword">this.x=x; </span></li>
<li> <span class="keyword">this.y=y; </span></li>
<li> }; </li>
<li> <span class="keyword">function LineImage(img,line){ </span></li>
<li> <span class="keyword">this.img=img; </span></li>
<li> <span class="keyword">this.line=line; </span></li>
<li> }; </li>
<li> </li>
<li> <span class="keyword">function NewImage(img,opsArray){ </span></li>
<li> <span class="keyword">this.img=img; </span></li>
<li> <span class="keyword">this.opsArray=opsArray; </span></li>
<li> }; </li>
<li> </li>
<li> <span class="keyword">var imgA= <span class="keyword">new Image(); </span></span></li>
<li> imgA.onload=<span class="keyword">function(){ </span></li>
<li> <span class="keyword">var imgObjA= createImage(imgA,100,100,100,100) </span></li>
<li> <span class="keyword">var array=<span class="keyword">new Array(); </span></span></li>
<li> <span class="keyword">var na=<span class="keyword">new NewImage(imgObjA,array); </span></span></li>
<li> imgArray.push(na); </li>
<li> layer.add(imgObjA); </li>
<li> stage.add(layer); </li>
<li> } </li>
<li> </li>
<li> <span class="keyword">var imgB= <span class="keyword">new Image(); </span></span></li>
<li> imgB.onload=<span class="keyword">function(){ </span></li>
<li> <span class="keyword">var imgObjB= createImage(imgB,400,400,100,100) </span></li>
<li> <span class="keyword">var array=<span class="keyword">new Array(); </span></span></li>
<li> <span class="keyword">var nb=<span class="keyword">new NewImage(imgObjB,array); </span></span></li>
<li> imgArray.push(nb); </li>
<li> layer.add(imgObjB); </li>
<li> stage.add(layer); </li>
<li> } </li>
<li> </li>
<li> <span class="keyword">var imgC= <span class="keyword">new Image(); </span></span></li>
<li> imgC.onload=<span class="keyword">function(){ </span></li>
<li> <span class="keyword">var imgObjC= createImage(imgC,700,100,100,100) </span></li>
<li> <span class="keyword">var array=<span class="keyword">new Array(); </span></span></li>
<li> <span class="keyword">var nc=<span class="keyword">new NewImage(imgObjC,array); </span></span></li>
<li> imgArray.push(nc); </li>
<li> layer.add(imgObjC); </li>
<li> stage.add(layer); </li>
<li> } </li>
<li> <span class="keyword">var rect=<span class="keyword">new Kinetic.Rect({ </span></span></li>
<li> x:0, </li>
<li> y:0, </li>
<li> width:1000, </li>
<li> height:1000, </li>
<li> fill:<span class="string">'white', </span></li>
<li> storke:<span class="string">'red', </span></li>
<li> storkeWidth:5 </li>
<li> </li>
<li> }); </li>
<li> layer.add(rect); </li>
<li> imgA.src=<span class="string">'img/db.png'; </span></li>
<li> imgB.src=<span class="string">'img/mj.png'; </span></li>
<li> imgC.src=<span class="string">"img/kt1.png"; </span></li>
<li> rect.on(<span class="string">'dblclick',<span class="keyword">function(){ </span></span></li>
<li> </li>
<li> <span class="keyword">if(loop%2==0){ </span></li>
<li> flag=<span class="keyword">true; </span></li>
<li> <span class="keyword">for(<span class="keyword">var i=0;i<imgArray.length;i++){ </span></span></li>
<li> imgArray.img.setDraggable(<span class="keyword">false); </span></li>
<li> </li>
<li> } </li>
<li> }<span class="keyword">else{ </span></li>
<li> flag=<span class="keyword">false; </span></li>
<li> </li>
<li> <span class="keyword">for(<span class="keyword">var i=0;i<imgArray.length;i++){ </span></span></li>
<li> </li>
<li> imgArray.img.setDraggable(<span class="keyword">true); </span></li>
<li> imgArray.img.on(<span class="string">'mouseover',<span class="keyword">function(){ </span></span></li>
<li> <span class="keyword">var p=<span class="keyword">new Pos(<span class="keyword">this.getX(),<span class="keyword">this.getY()); </span></span></span></span></li>
<li> tmpMoveImg=getImgByPos(p); </li>
<li> </li>
<li> }) </li>
<li> </li>
<li> imgArray.img.on(<span class="string">'dragmove',<span class="keyword">function(){ </span></span></li>
<li> </li>
<li> <span class="keyword">for(<span class="keyword">var j=0;j<tmpMoveImg.opsArray.length;j++){ </span></span></li>
<li> <span class="keyword">var realPoints=[]; </span></li>
<li> calculateStartEndPos(tmpMoveImg.opsArray.img,<span class="keyword">this,realPoints); </span></li>
<li> <span class="keyword">var line= createLine(realPoints); </span></li>
<li> <span class="keyword">var oldLine=tmpMoveImg.opsArray.line; </span></li>
<li> <span class="keyword">var p=<span class="keyword">new Pos(tmpMoveImg.opsArray.img.getX(),tmpMoveImg.opsArray.img.getY()); </span></span></li>
<li> <span class="keyword">var oppoImg= getImgByPos(p); </span></li>
<li> replaceOppoLine(oppoImg,oldLine,line); </li>
<li> layer.remove(tmpMoveImg.opsArray.line); </li>
<li> tmpMoveImg.opsArray.line=line; </li>
<li> layer.add(line); </li>
<li> layer.draw(); </li>
<li> realPoints=[]; </li>
<li> </li>
<li> } </li>
<li> </li>
<li> layer.draw(); </li>
<li> </li>
<li> }) </li>
<li> } </li>
<li> } </li>
<li> loop++; </li>
<li> </li>
<li> <span class="keyword">for(<span class="keyword">var i=0;i<imgArray.length;i++){ </span></span></li>
<li> <span class="keyword">var innerFlag=<span class="keyword">false; </span></span></li>
<li> <span class="keyword">var points=[];<span class="comment">//标记性的点,为了获取img 使用 </span></span></li>
<li> <span class="keyword">var realPoints=[];<span class="comment">//真正计算后合理的划线点 </span></span></li>
<li> imgArray.img.on(<span class="string">'mousedown',<span class="keyword">function(){ </span></span></li>
<li> </li>
<li> <span class="keyword">if(flag){ </span></li>
<li> <span class="keyword">var pos= stage.getMousePosition(); </span></li>
<li> points.push(<span class="keyword">this.getX()); </span></li>
<li> points.push(<span class="keyword">this.getY()); </span></li>
<li> innerFlag=<span class="keyword">true; </span></li>
<li> } </li>
<li> }); </li>
<li> imgArray.img.on(<span class="string">'mouseup',<span class="keyword">function(){ </span></span></li>
<li> <span class="keyword">if(flag&&innerFlag){ </span></li>
<li> <span class="keyword">var pos= stage.getMousePosition(); </span></li>
<li> points.push(<span class="keyword">this.getX()); </span></li>
<li> points.push(<span class="keyword">this.getY()); </span></li>
<li> </li>
<li> </li>
<li> <span class="keyword">var p=<span class="keyword">new Pos(points,points); </span></span></li>
<li> <span class="keyword">var op=<span class="keyword">new Pos(points,points); </span></span></li>
<li> <span class="keyword">var opImg=getImgByPos(p); </span></li>
<li> <span class="keyword">var owImg=getImgByPos(op); </span></li>
<li> <span class="keyword">if(opImg!=owImg){ </span></li>
<li> calculateStartEndPos(opImg.img,owImg.img,realPoints); </li>
<li> <span class="keyword">var line= createLine(realPoints); </span></li>
<li> </li>
<li> <span class="keyword">var opLine=<span class="keyword">new LineImage(opImg.img,line); </span></span></li>
<li> <span class="keyword">var owLine=<span class="keyword">new LineImage(owImg.img,line); </span></span></li>
<li> </li>
<li> </li>
<li> owImg.opsArray.push(opLine); </li>
<li> opImg.opsArray.push(owLine); </li>
<li> </li>
<li> </li>
<li> flag=<span class="keyword">false; </span></li>
<li> innerFlag=<span class="keyword">false; </span></li>
<li> points=[]; </li>
<li> realPoints=[]; </li>
<li> layer.add(line); </li>
<li> layer.draw(); </li>
<li> } </li>
<li> </li>
<li> </li>
<li> } </li>
<li> }); </li>
<li> } </li>
<li> }) </li>
<li> <span class="comment">/** </span></li>
<li><span class="comment"> * 通过坐标获取Img对象 </span></li>
<li><span class="comment"> */ </span></li>
<li> <span class="keyword">function getImgByPos(pos){ </span></li>
<li> <span class="keyword">for(<span class="keyword">var i=0;i<imgArray.length;i++){ </span></span></li>
<li> <span class="keyword">if(imgArray.img.getX()==pos.x&&imgArray.img.getY()==pos.y){ </span></li>
<li> <span class="keyword">return imgArray; </span></li>
<li> } </li>
<li> } </li>
<li> } </li>
<li> <span class="comment">/** </span></li>
<li><span class="comment"> * 替换对方中line </span></li>
<li><span class="comment"> */ </span></li>
<li> <span class="keyword">function replaceOppoLine(imgObj,oldLine,newLine){ </span></li>
<li> <span class="keyword">for(<span class="keyword">var i=0;i<imgObj.opsArray.length;i++){ </span></span></li>
<li> </li>
<li> <span class="keyword">if(imgObj.opsArray.line==oldLine){ </span></li>
<li> imgObj.opsArray.line=newLine; </li>
<li> } </li>
<li> } </li>
<li> } </li>
<li> <span class="comment">/** </span></li>
<li><span class="comment"> 划线 </span></li>
<li><span class="comment"> */ </span></li>
<li> <span class="keyword">function createLine(points){ </span></li>
<li> </li>
<li> <span class="keyword">var line=<span class="keyword">new Kinetic.Line({ </span></span></li>
<li> points:points, </li>
<li> stroke:<span class="string">'bule', </span></li>
<li> strokeWidth:5, </li>
<li> lineCap:<span class="string">'round', </span></li>
<li> lineJoin:<span class="string">'round' </span></li>
<li> </li>
<li> }); </li>
<li> </li>
<li> <span class="keyword">return line; </span></li>
<li> } </li>
<li> <span class="comment">/** </span></li>
<li><span class="comment"> * 计算划线的开始坐标 </span></li>
<li><span class="comment"> */ </span></li>
<li> <span class="keyword">function calculateStartEndPos(imgStart,imgEnd,realPoints){ </span></li>
<li> <span class="keyword">var realSx=0; </span></li>
<li> <span class="keyword">var realSy=0; </span></li>
<li> <span class="keyword">var realEx=0; </span></li>
<li> <span class="keyword">var realEy=0; </span></li>
<li> </li>
<li> <span class="keyword">var sx=imgStart.getX(); </span></li>
<li> <span class="keyword">var sy=imgStart.getY(); </span></li>
<li> <span class="keyword">var swidth=imgStart.getWidth(); </span></li>
<li> <span class="keyword">var sheight=imgStart.getHeight(); </span></li>
<li> <span class="keyword">var ex=imgEnd.getX(); </span></li>
<li> <span class="keyword">var ey=imgEnd.getY(); </span></li>
<li> <span class="keyword">var ewidth=imgEnd.getWidth(); </span></li>
<li> <span class="keyword">var eheight=imgEnd.getHeight(); </span></li>
<li> </li>
<li> <span class="keyword">var arrayx=calculateX(sx,swidth,ex,ewidth ); </span></li>
<li> </li>
<li> <span class="keyword">var arrayy=calculateY(sy,sheight,ey,eheight ); </span></li>
<li> </li>
<li> </li>
<li> realPoints.push(arrayx); </li>
<li> realPoints.push(arrayy); </li>
<li> realPoints.push(arrayx); </li>
<li> realPoints.push(arrayy); </li>
<li> </li>
<li> } </li>
<li> <span class="comment">/** </span></li>
<li><span class="comment"> 计算开始和结束节点x坐标 </span></li>
<li><span class="comment"> */ </span></li>
<li> <span class="keyword">function calculateX(sx,swidth,ex,ewidth ){ </span></li>
<li> <span class="keyword">var arrayX=[]; </span></li>
<li> <span class="keyword">if(sx>ex){ </span></li>
<li> arrayX.push(sx); </li>
<li> arrayX.push(ex+ewidth); </li>
<li> </li>
<li> }<span class="keyword">else <span class="keyword">if(sx==ex){ </span></span></li>
<li> arrayX.push(sx+(swidth/2)); </li>
<li> arrayX.push(sx+(ewidth/2)); </li>
<li> }<span class="keyword">else{ </span></li>
<li> arrayX.push(sx+swidth); </li>
<li> arrayX.push(ex); </li>
<li> } </li>
<li> <span class="keyword">return arrayX; </span></li>
<li> } </li>
<li> <span class="comment">/** </span></li>
<li><span class="comment"> 计算开始和结束节点y坐标 </span></li>
<li><span class="comment"> */ </span></li>
<li> <span class="keyword">function calculateY(sy,sheight,ey,eheight ){ </span></li>
<li> </li>
<li> </li>
<li> <span class="keyword">var arrayY=[]; </span></li>
<li> <span class="keyword">if(sy>ey){ </span></li>
<li> arrayY.push(sy+(sheight/2)); </li>
<li> arrayY.push(ey+(eheight/2)); </li>
<li> }<span class="keyword">else <span class="keyword">if(sy==ey){ </span></span></li>
<li> </li>
<li> arrayY.push(sy+(sheight/2)); </li>
<li> arrayY.push(sy+(eheight/2)); </li>
<li> }<span class="keyword">else{ </span></li>
<li> arrayY.push(sy+(sheight/2)); </li>
<li> arrayY.push(ey+(eheight/2)); </li>
<li> </li>
<li> } </li>
<li> <span class="keyword">return arrayY; </span></li>
<li> } </li>
<li> <span class="comment">/** </span></li>
<li><span class="comment"> 画图 </span></li>
<li><span class="comment"> */ </span></li>
<li> <span class="keyword">function createImage(img,x,y,width,height){ </span></li>
<li> <span class="keyword">var imgObj=<span class="keyword">new Kinetic.Image({ </span></span></li>
<li> x:x, </li>
<li> y:y, </li>
<li> width:width, </li>
<li> height:height, </li>
<li> draggable:<span class="keyword">true, </span></li>
<li> image:img </li>
<li> }); </li>
<li> imgObj.on(<span class="string">"mouseover", <span class="keyword">function(){ </span></span></li>
<li> document.body.style.cursor = <span class="string">"pointer"; </span></li>
<li> }); </li>
<li> imgObj.on(<span class="string">"mouseout", <span class="keyword">function(){ </span></span></li>
<li> document.body.style.cursor = <span class="string">"default"; </span></li>
<li> }); </li>
<li> <span class="keyword">return imgObj </span></li>
<li> </li>
<li> } </li>
<li> </li>
<li> }); </li>
<li> </li>
<li> </script> </li>
<li> </head> </li>
<li> <body> </li>
<li> <div id=<span class="string">"container"></div> </span></li>
<li> </body> </li>
<li></html> </li>
<li> </li>
<li><img alt=<span class="string">"" src=<span class="string">"http://dl.iteye.com/upload/attachment/0070/8176/f9bb5503-b35b-3a45-abb1-0241a1495665.png"> </span></span></li>
<li> </li>
<li> </li>
<li><img alt=<span class="string">"" src=<span class="string">"http://dl.iteye.com/upload/attachment/0070/8178/54c788d0-1395-3824-aea1-280b70b6f523.png"> </span></span></li>
<li> </li>
<li> </li>
</ol></div>
<p> 效果如下<br><img alt="" data-src="http://dl.iteye.com/upload/attachment/0070/6648/40e36fc5-57b4-33da-a5f1-d73a3996261c.png"><br> <br><img src="http://dl.iteye.com/upload/attachment/0070/6646/3b1a389b-7f5b-3ded-8dd6-d2838b933da3.png"></p>
<p> 代码里还有一项基于extjs4 的实现和纯html5 canvas 的实现</p>
<div class="attachments">
<ul>
<li>ExtDraw.zip (2.1 MB)</li>
<li>下载次数: 420</li>
</ul>
<ul>
<li>ExtDraw1.zip (2.2 MB)</li>
<li>下载次数: 455</li>
</ul>
<ul>
<li>查看图片附件</li>
</ul>
</div>
<p><br><br></p><br><br>
来源:https://www.cnblogs.com/zjw2004112/p/11770429.html
頁:
[1]