handwritingapi.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. QQShuru = {};
  2. QQShuru.Util = {};
  3. QQShuru.Util.Browser = {};
  4. QQShuru.Util.Browser.isIE = (navigator.appName == "Microsoft Internet Explorer");
  5. QQShuru.Util.Ajax = {};
  6. QQShuru.Util.Ajax.get = function(a, c) {
  7. var b = document.createElement("script");
  8. b.setAttribute("charset", "utf-8");
  9. b.id = Math.random();
  10. document.getElementsByTagName("head")[0].appendChild(b);
  11. b.src = a + "&c=" + c;
  12. if (QQShuru.Util.Browser.isIE) {
  13. b.onreadystatechange = function() {
  14. if (b.readyState == "loaded") {
  15. document.getElementsByTagName("head")[0].removeChild(b)
  16. }
  17. }
  18. } else {
  19. b.onload = function() {
  20. document.getElementsByTagName("head")[0].removeChild(b)
  21. }
  22. }
  23. };
  24. QQShuru.Util.Event = {};
  25. QQShuru.Util.Event.addEvent = function() {
  26. if (QQShuru.Util.Browser.isIE) {
  27. return function(b, c, a) {
  28. b.attachEvent("on" + c, a)
  29. }
  30. } else {
  31. return function(b, c, a, d) {
  32. b.addEventListener(c, a, d || false)
  33. }
  34. }
  35. } ();
  36. QQShuru.Util.Event.remEvent = function() {
  37. if (QQShuru.Util.Browser.isIE) {
  38. return function(b, c, a) {
  39. b.detachEvent("on" + c, a)
  40. }
  41. } else {
  42. return function(b, c, a, d) {
  43. b.removeEventListener(c, a, d || false)
  44. }
  45. }
  46. } ();
  47. QQShuru.Util.Event.getPoint = function(a) {
  48. if (QQShuru.Util.Browser.isIE) {
  49. return [a.x, a.y]
  50. } else {
  51. return [a.layerX, a.layerY]
  52. }
  53. };
  54. /*
  55. 初始化函数
  56. * params:obj
  57. * obj={
  58. * canvasId:canvas的id --required
  59. * lineColor: 默认#606060 ,
  60. * lineWidth: 默认10
  61. * backBtnId: 退一步按钮id
  62. * clearBtnId:清空canvas按钮id
  63. * callback:func 每次请求后回调
  64. * }
  65. *
  66. *
  67. */
  68. QQShuru.HWPanel = function(obj) {
  69. var o = QQShuru.Util.Browser.isIE;
  70. var m = QQShuru.Util.Event.addEvent;
  71. var j = QQShuru.Util.Event.remEvent;
  72. var B = QQShuru.Util.Event.getPoint;
  73. var h = document;
  74. var H = document.body;
  75. var z = document.documentElement;
  76. var f = [];
  77. var K = [];
  78. var O = [];
  79. var i = document.querySelector(obj.canvasId);
  80. var v = o ? 1 : 0;
  81. var a = 2;
  82. var N = i.clientWidth;//canvas宽度
  83. var R = i.clientHeight;//canvas高度
  84. var c = obj.lineColor?obj.lineColor:"#606060"; //线条颜色
  85. var y = obj.lineWidth?obj.lineWidth:10;//线条宽度
  86. var t = "round";
  87. var J = !!i.getContext;
  88. if (J) {
  89. var Q = i.getContext("2d");
  90. Q.lineCap = t;
  91. Q.lineJoin = t;
  92. Q.lineWidth = y;
  93. Q.strokeStyle = c
  94. }
  95. var L = false;
  96. var P = false;
  97. var u = 0;
  98. var T = [];
  99. var r = 0;
  100. var e = [],
  101. d = [],
  102. I = [];
  103. var D = [],
  104. C = [];
  105. pointsDeltaXY = [];
  106. var k = [0, 0];
  107. //鼠标按下事件
  108. var l = function(W) {
  109. if (v !== W.button) {
  110. return
  111. }
  112. var Y = B(W);
  113. if (!Y) {
  114. return
  115. }
  116. L = true;
  117. r = 0;
  118. e = [];
  119. d = [];
  120. I = [];
  121. D = [];
  122. C = [];
  123. pointsDeltaXY = [];
  124. e[r] = Y[0];
  125. d[r] = Y[1];
  126. I[r * 2] = Y[0];
  127. I[r * 2 + 1] = Y[1];
  128. D[r] = Y[0];
  129. C[r] = Y[1];
  130. pointsDeltaXY[r * 2] = Y[0];
  131. pointsDeltaXY[r * 2 + 1] = Y[1];
  132. if (J) {
  133. Q.beginPath();
  134. Q.moveTo(Y[0], Y[1])
  135. }
  136. k[0] = Y[0];
  137. k[1] = Y[1];
  138. r++;
  139. if (o) {
  140. m(i, "losecapture", n);
  141. i.setCapture()
  142. } else {
  143. m(window, "blur", n)
  144. }
  145. };
  146. //鼠标移动事件
  147. var A = function(W) {
  148. if (!L) {
  149. return
  150. }
  151. var Y = B(W);//坐标
  152. if (!Y) {
  153. return
  154. }
  155. e[r] = Y[0];
  156. d[r] = Y[1];
  157. I[r * 2] = Y[0];
  158. I[r * 2 + 1] = Y[1];
  159. D[r] = Y[0] - k[0];
  160. C[r] = Y[1] - k[1];
  161. pointsDeltaXY[r * 2] = D[r];
  162. pointsDeltaXY[r * 2 + 1] = C[r];
  163. if (J) {
  164. Q.lineTo(Y[0], Y[1]);
  165. Q.stroke()
  166. } else {
  167. var X = T[u].e.path;
  168. X.value = X.value.replace(" e", "," + Y[0] + "," + Y[1] + " e")
  169. }
  170. k[0] = Y[0];
  171. k[1] = Y[1];
  172. r++
  173. };
  174. //鼠标松开事件
  175. var n = function(W) {
  176. if (!L) {
  177. return
  178. }
  179. L = false;
  180. if (1 === r) {
  181. if (!J) {
  182. T[u].e.style.visibility = "hidden"
  183. }
  184. return
  185. }
  186. if (J) {
  187. Q.closePath();
  188. var Z = i.cloneNode(false);
  189. Z.style.display = "none";
  190. Z.getContext("2d").drawImage(i, 0, 0);
  191. T[u] = {
  192. e: Z
  193. };
  194. Z = null
  195. }
  196. var aa = T[u];
  197. aa.count = r;
  198. aa.x = e.slice(0);
  199. aa.y = d.slice(0);
  200. aa.xy = I.slice(0);
  201. aa.deltaX = D.slice(0);
  202. aa.deltaY = C.slice(0);
  203. aa.deltaXY = pointsDeltaXY.slice(0);
  204. u++;
  205. var X = [];
  206. for (var Y = 0; Y < r; Y++) {
  207. X[Y] = "[" + e[Y] + ", " + d[Y] + "]"
  208. }
  209. if (o) {
  210. j(i, "losecapture", n);
  211. i.releaseCapture()
  212. } else {
  213. j(window, "blur", n)
  214. }
  215. if (1 === u) {
  216. i.className = "writting"
  217. }
  218. s(u);
  219. };
  220. //清空所有
  221. var V = function(W) {
  222. if (0 === u) {
  223. return
  224. }
  225. var ab = "";
  226. if (J) {
  227. Q.clearRect(0, 0, N, R)
  228. }
  229. for (var Z = 0; Z < u; Z++) {
  230. T[Z].e.style.visibility = "hidden"
  231. }
  232. u = 0;
  233. i.className = ""
  234. };
  235. //退一笔
  236. var g = function(W) {
  237. if (0 === u) {
  238. return
  239. }
  240. if (1 === u) {
  241. V();
  242. return
  243. }
  244. u--;
  245. if (J) {
  246. Q.clearRect(0, 0, N, R);
  247. Q.drawImage(T[u - 1].e, 0, 0)
  248. }
  249. T[u].e.style.visibility = "hidden";
  250. s(u)
  251. };
  252. var p = function(W, ab) {
  253. var aa = ab || W.length;
  254. var Z = "";
  255. var ad = "";
  256. for (var X = 0; X < aa; ++X) {
  257. var ac = W[X];
  258. ad = X ? ",eb,": "";
  259. var Y = ad + ac.deltaXY.join(",");
  260. Z += Y
  261. }
  262. return Z
  263. };
  264. this.ajax_callback = function(X) {
  265. obj.callback&&obj.callback(X)
  266. };
  267. QQShuru.HWPanel.ajax_callback = this.ajax_callback;
  268. var s = function(Y) {
  269. var Z = p(T, Y);
  270. var ab = "QQShuru.HWPanel.ajax_callback";
  271. var W = "https://handwriting.shuru.qq.com/cloud/cgi-bin/cloud_hw_pub.wsgi";
  272. var aa = "track_str=" + Z + "&cmd=0";
  273. var X = W + "?" + aa;
  274. QQShuru.Util.Ajax.get(X, ab)
  275. };
  276. m(i, "mousedown", l);
  277. m(i, "mousemove", A);
  278. m(i, "mouseup", n);
  279. m(i, "dblclick", V);
  280. m(i, "contextmenu",
  281. function(W) {
  282. o ? (W.returnValue = false) : W.preventDefault()
  283. });
  284. m(h, "mouseup", n);
  285. if(obj.backBtnId){
  286. m(document.querySelector(obj.backBtnId), "click", g);
  287. }
  288. if(obj.clearBtnId){
  289. m(document.querySelector(obj.clearBtnId), "click", V);
  290. }
  291. this.clear=V;//暴露清空canvas的方法到外部
  292. this.back=g;//暴露退一步的方法到外部
  293. };