原生js实现Canvas实现拖拽式绘图,支持画笔、线条、箭头、三角形和圆形等等图形绘制功能,有实例Demo

 

前言

需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 – –

演示地址:查看演示DEMO

新版本支持IE5+(你没看错,就是某软的IE浏览器)以上任意浏览器的Canvas绘图:http://blog.csdn.net/eguid_1/article/details/79310269

项目维护于github:https://github.com/eguid/graffitiCanvas

一、实现的功能

1、基于oop思想构建,支持坐标点、线条(由坐标点组成,包含方向)、多边形(由多个坐标点组成)、圆形(包含圆心坐标点和半径)等实体

2、原生JavaScript实现,不依赖任何第三方js库和插件

3、多图形绘制(支持画笔、线条、箭头、三角形、矩形、平行四边形、梯形以及多边形和圆形绘制)

4、拖拽式绘制(鼠标移动过程中不断进行canvas重绘)

5、图片绘制(作为背景图片时重绘会发生闪烁现象,暂时有点问题,后面继续完善)

5、清空绘制功能

6、新版本优化绘制性能(使用共享坐标变量数组,减少了大量的对象创建操作)

7、新版本支持箭头绘制功能

二、完整实现代码

 


  1. DrawingTools =(function(){
  2. //公共方法
  3. var getDom=function(id){return document.getElementById(id)};
  4. var isNull=function(s){return s==undefined||typeof(s)=='undefined'||s==null||s=='null'||s==''||s.length1};
  5. var hideDefRM=function(){document.oncontextmenu=function(){return false}};//屏蔽浏览器默认鼠标事件
  6. /**绘图容器*/
  7. var cbtCanvas;
  8. /**绘图对象*/
  9. var cxt;
  10. /**绘制的图形列表*/
  11. var shapes=new Array();
  12. var graphkind={'cursor':0,'pen':1,'line':2,'trian':3,'rect':4,'poly':5,'circle':6,'arrow':21,'parallel':41,'trapezoid':42};
  13. //背景图片绘制配置
  14. var bgPictureConfig={
  15. pic:null,//背景图片地址或路径
  16. repaint:true,//是否作为永久背景图,每次清除时会进行重绘
  17. };
  18. //加载并绘制图片(src:图片路径或地址),默认重绘背景图
  19. var loadPicture=function(src){
  20. if(isNull(bgPictureConfig.repaint)||bgPictureConfig.repaint){bgPictureConfig.pic=src}
  21. var img = new Image();
  22. img.onload = function(){cxt.drawImage(img,0,0)}
  23. img.src =src;
  24. }
  25. //绘图基础配置
  26. var paintConfig={lineWidth:1,//线条宽度,默认1
  27. strokeStyle:'red',//画笔颜色,默认红色
  28. fillStyle:'red',//填充色
  29. lineJoin:"round",//线条交角样式,默认圆角
  30. lineCap:"round",//线条结束样式,默认圆角
  31. };
  32. //重新载入绘制样式
  33. var resetStyle=function(){
  34. cxt.strokeStyle=paintConfig.strokeStyle;
  35. cxt.lineWidth=paintConfig.lineWidth;
  36. cxt.lineJoin=paintConfig.lineJoin;
  37. cxt.lineCap=paintConfig.lineCap;
  38. cxt.fillStyle=paintConfig.fillStyle;
  39. }
  40. //鼠标图形
  41. var cursors=['crosshair','pointer'];
  42. /** 切换鼠标样式*/
  43. var switchCorser=function(b){
  44. cbtCanvas.style.cursor=((isNull(b)span class="hljs-title function_">isDrawing():b)ursors[0]:cursors[1]);
  45. }
  46. //操作控制变量组
  47. var ctrlConfig={
  48. kind:0,//当前绘画分类
  49. isPainting:false,//是否开始绘制
  50. startPoint:null,//起始点
  51. cuGraph:null,//当前绘制的图像
  52. cuPoint:null,//当前临时坐标点,确定一个坐标点后重新构建
  53. cuAngle:null,//当前箭头角度
  54. vertex:[],//坐标点
  55. }
  56. /**获取当前坐标点*/
  57. var getCuPoint=function(i){
  58. return ctrlConfig.cuPoint[i];
  59. }
  60. /**设置当前坐标点*/
  61. var setCuPoint=function(p,i){
  62. return ctrlConfig.cuPoint[i]=p;
  63. }
  64. /**设置当前临时坐标点值*/
  65. var setCuPointXY=function(x,y,i){
  66. if(isNull(ctrlConfig.cuPoint)){
  67. var arr=new Array();
  68. arr[i]=new Point(x,y);
  69. ctrlConfig.cuPoint=arr;
  70. }else if(isNull(ctrlConfig.cuPoint[i])){
  71. setCuPoint(new Point(x,y),i);
  72. }else{
  73. ctrlConfig.cuPoint[i].setXY(x,y);
  74. }
  75. return getCuPoint(i);
  76. }
  77. /**是否正在绘制*/
  78. var isDrawing=function (){
  79. return ctrlConfig.isPainting;
  80. }
  81. /**开始绘制状态*/
  82. var beginDrawing=function(){
  83. ctrlConfig.isPainting=true;
  84. }
  85. /**结束绘制状态*/
  86. var stopDrawing=function(){
  87. ctrlConfig.isPainting=false;
  88. }
  89. /**是否有开始坐标点*/
  90. var hasStartPoint=function(){
  91. return !isNull(ctrlConfig.startPoint);
  92. }
  93. /**设置当前绘制的图形*/
  94. var setCuGraph=function(g){
  95. ctrlConfig.cuGraph=g;
  96. }
  97. /**获取当前绘制的图形*/
  98. var getCuGraph=function(){
  99. return ctrlConfig.cuGraph;
  100. }
  101. /**设置开始坐标点(线条的起始点,三角形的顶点,圆形的圆心,四边形的左上角或右下角,多边形的起始点)*/
  102. var setStartPoint=function(p){
  103. ctrlConfig.startPoint=p;
  104. }
  105. /**获取开始坐标点*/
  106. var getStartPoint=function(){
  107. return ctrlConfig.startPoint;
  108. }
  109. 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年10月6日
下一篇 2017年10月7日

相关推荐