微信小程序canvas实现签名(源码)

r囧r小猫 2022-11-19 09:52 345阅读 0赞
  1. <!--pages/page/cvsAutograph/cvsAutograph.wxml-->
  2. <view class="wrapper">
  3. <view class="handBtn">
  4. <button class="backBtn">返回</button>
  5. <button catchtap="cleardraw" class="delBtn">清空</button>
  6. <button catchtap="getimg" class="subBtn">完成</button>
  7. </view>
  8. <view class="handCenter">
  9. <canvas class="canvas" style="height:{
  10. {cvsHeight=='100%'?cvsHeight:cvsHeight+'px'}}" id="canvas" canvas-id="canvas" disable-scroll="true" bindtouchstart="canvasStart" bindtouchmove="canvasMove" bindtouchend="canvasEnd" touchcancel="canvasEnd" binderror="canvasIdErrorCallback"></canvas>
  11. <cover-image class='overImg' src="{
  12. {src}}" wx:if="{
  13. {src!=''}}">
  14. </cover-image>
  15. </view>
  16. <view class="handRight">
  17. <view class="handTitle">签名板</view>
  18. </view>
  19. </view>
  20. /* pages/page/cvsAutograph/cvsAutograph.wxss */
  21. page {
  22. background: #fbfbfb;
  23. height: auto;
  24. overflow: hidden;
  25. }
  26. canvas {
  27. width:100%;
  28. /* height:100%; */
  29. }
  30. .wrapper {
  31. width: 100%;
  32. height: 95vh;
  33. margin: 30rpx 0;
  34. overflow: hidden;
  35. display: flex;
  36. align-content: center;
  37. flex-direction: row;
  38. justify-content: center;
  39. font-size: 28rpx;
  40. }
  41. /* .handWriting {
  42. background: #fff;
  43. width: 100%;
  44. height: 95vh;
  45. } */
  46. .handRight {
  47. display: inline-flex;
  48. align-items: center;
  49. }
  50. .handCenter {
  51. position: relative;
  52. border: 4rpx dashed #e9e9e9;
  53. flex: 5;
  54. overflow: hidden;
  55. box-sizing: border-box;
  56. }
  57. .overImg{
  58. position: absolute;
  59. top: 0;
  60. left: 0;
  61. background-color: #fff;
  62. }
  63. .handTitle {
  64. transform: rotate(90deg);
  65. flex: 1;
  66. color: #666;
  67. }
  68. .handBtn button {
  69. font-size: 28rpx;
  70. }
  71. .handBtn {
  72. height: 95vh;
  73. display: inline-flex;
  74. flex-direction: column;
  75. justify-content: space-between;
  76. align-content: space-between;
  77. flex: 1;
  78. }
  79. .backBtn{
  80. position: absolute;
  81. top: 50rpx;
  82. left: 0rpx;
  83. transform: rotate(90deg);
  84. color: #666;
  85. }
  86. .delBtn {
  87. position: absolute;
  88. top: 250rpx;
  89. left: 0rpx;
  90. transform: rotate(90deg);
  91. color: #666;
  92. }
  93. .subBtn {
  94. position: absolute;
  95. bottom: 52rpx;
  96. left: -3rpx;
  97. display: inline-flex;
  98. transform: rotate(90deg);
  99. background: #008ef6;
  100. color: #fff;
  101. margin-bottom: 30rpx;
  102. text-align: center;
  103. justify-content: center;
  104. }
  105. // canvas 全局配置
  106. var context = null;// 使用 wx.createContext 获取绘图上下文 context
  107. var arrx = [];//所有点的X轴集合
  108. var arry = [];//所有点的Y轴集合
  109. var canvasw = 0;//画布的宽
  110. var canvash = 0;//画布的高
  111. var top = 0;
  112. var left = 0;
  113. let app = getApp();
  114. //注册页面
  115. Page({
  116. canvasIdErrorCallback: function (e) {
  117. console.error(e.detail.errMsg)
  118. },
  119. //绘制之前
  120. canvasStart: function (event) {
  121. arrx.push(event.changedTouches[0].x);
  122. arry.push(event.changedTouches[0].y);
  123. //就算点击之后手指没有移动,那么下次要移动之前还是必定会先触发这个
  124. },
  125. //手指移动过程
  126. canvasMove: function (event) {
  127. context.moveTo(arrx[arrx.length - 1], arry[arrx.length - 1])
  128. arrx.push(event.changedTouches[0].x);
  129. arry.push(event.changedTouches[0].y);
  130. context.lineTo(event.changedTouches[0].x, event.changedTouches[0].y);
  131. context.setLineWidth(4);//设置线条的宽度
  132. context.setLineCap('round');//设置结束时 点的样式
  133. context.stroke();//画线
  134. context.draw(true);//设置为true时,会保留上一次画出的图像,false则会清空
  135. },
  136. //手指离开
  137. canvasEnd: function (event) {
  138. },
  139. cleardraw: function () {
  140. //清除画布
  141. arrx = [];
  142. arry = [];
  143. // arrz = [];
  144. context.clearRect(0, 0, canvasw, canvash);
  145. context.draw(false);
  146. this.setData({
  147. cvsHeight: "100%",
  148. src:''
  149. })
  150. },
  151. //导出图片
  152. getimg: function () {
  153. if (arrx.length == 0) {
  154. wx.showModal({
  155. title: '提示',
  156. content: '签名内容不能为空!',
  157. showCancel: false
  158. });
  159. return false;
  160. };
  161. wx.showLoading({
  162. title: '签名生成中..',
  163. mask:true
  164. })
  165. let that = this;
  166. //先拿到竖着的地址给image,挡住下面的操作!
  167. wx.canvasToTempFilePath({
  168. canvasId: 'canvas',
  169. // width: canvasw,
  170. // height: canvash,
  171. // destWidth: canvasw,
  172. // destHeight: canvasw * canvasw / canvash,
  173. success: function (res) {
  174. //把当前的图片放上去挡住,接着操作下面的canvas
  175. that.setData({
  176. src: res.tempFilePath,
  177. cvsHeight: canvasw * canvasw / canvash
  178. })
  179. context.clearRect(0, 0, canvasw, canvash);
  180. context.translate(0, canvasw/2.4);
  181. context.rotate(270 * Math.PI / 180);
  182. context.drawImage(res.tempFilePath, 0, 0,canvasw * canvasw / canvash, canvasw);
  183. context.draw(false, setTimeout(function () {
  184. wx.canvasToTempFilePath({
  185. canvasId: 'canvas',
  186. success: result => {
  187. console.log(result.tempFilePath);
  188. //转成base64
  189. wx.getFileSystemManager().readFile({
  190. filePath: res.tempFilePath, //选择图片返回的相对路径
  191. encoding: 'base64', //编码格式
  192. success: result => { //成功的回调
  193. let base64 = result.data;
  194. }
  195. })
  196. //全局变量,用于返回显示
  197. app.globalData.pages.cvsAutograph.autograph = result.tempFilePath;
  198. wx.navigateTo({
  199. url: '../index/index'
  200. })
  201. wx.hideLoading()
  202. }
  203. }, this)
  204. }, 100))
  205. }
  206. })
  207. },
  208. /**
  209. * 页面的初始数据
  210. */
  211. data: {
  212. src: "",
  213. cvsHeight:'100%',
  214. },
  215. /**
  216. * 生命周期函数--监听页面加载
  217. */
  218. onLoad: function (options) {
  219. wx.showLoading({
  220. title: '加载中...',
  221. mask: true
  222. })
  223. // 使用 wx.createContext 获取绘图上下文 context
  224. context = wx.createCanvasContext('canvas');
  225. context.beginPath();
  226. var query = wx.createSelectorQuery();
  227. query.select('.handCenter').boundingClientRect(rect => {
  228. top = rect.top;
  229. left = rect.left;
  230. canvasw = rect.width;
  231. canvash = rect.height;
  232. wx.hideLoading()
  233. }).exec();
  234. }
  235. })

转载地址:https://blog.csdn.net/Arbort_/article/details/95057547#comments_14666882

发表评论

表情:
评论列表 (有 0 条评论,345人围观)

还没有评论,来说两句吧...

相关阅读