sign.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <template>
  2. <view class="signature-box">
  3. <view class="sign-wrap" v-show="showCanvas">
  4. <!-- 签名 -->
  5. <view class="signature" >
  6. <view class="signature-title">
  7. <text>请输入签名信息</text>
  8. </view>
  9. <canvas class="mycanvas" canvas-id="mycanvas" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"></canvas>
  10. <view class="footer">
  11. <u-button @click="saveCanvasImg" type="primary" :plain="true" :ripple="true" ripple-bg-color="#909399">保存</u-button>
  12. <u-button @click="clear" type="warning" :plain="true" :ripple="true" ripple-bg-color="#909399">清除</u-button>
  13. <u-button @click="close" type="error" :plain="true" :ripple="true" ripple-bg-color="#909399">关闭</u-button>
  14. </view>
  15. </view>
  16. <!-- 签完名后生成的图片 -->
  17. <view v-show="SignatureImg" class="SignatureImg">
  18. <image :src="SignatureImg" mode=""></image>
  19. </view>
  20. <!-- 清除签完名后生成的图片 -->
  21. <u-button v-show="SignatureImg" @click="obliterate" type="error" :plain="true" :ripple="true" ripple-bg-color="#909399" size="medium">清除签名</u-button>
  22. </view>
  23. </view>
  24. </template>
  25. <script>
  26. var x = 20;
  27. var y = 20;
  28. export default {
  29. data() {
  30. return {
  31. //绘图图像
  32. ctx: '',
  33. //路径点集合
  34. points: [],
  35. //签名图片
  36. SignatureImg: ''
  37. };
  38. },
  39. props: ['showCanvas'],
  40. methods: {
  41. //清除签名的图片
  42. obliterate() {
  43. if (this.SignatureImg) {
  44. this.SignatureImg = '';
  45. }
  46. this.close();
  47. },
  48. //关闭并清空画布
  49. close() {
  50. this.$emit('closeCanvas');
  51. this.clear();
  52. },
  53. //创建并显示画布
  54. createCanvas() {
  55. this.ctx = uni.createCanvasContext('mycanvas', this); //创建绘图对象
  56. //设置画笔样式
  57. this.ctx.lineWidth = 4;
  58. this.ctx.lineCap = 'round';
  59. this.ctx.lineJoin = 'round';
  60. },
  61. //触摸开始,获取到起点
  62. touchstart(e) {
  63. let startX = e.changedTouches[0].x;
  64. let startY = e.changedTouches[0].y;
  65. let startPoint = { X: startX, Y: startY };
  66. this.points.push(startPoint);
  67. //每次触摸开始,开启新的路径
  68. this.ctx.beginPath();
  69. },
  70. //触摸移动,获取到路径点
  71. touchmove(e) {
  72. let moveX = e.changedTouches[0].x;
  73. let moveY = e.changedTouches[0].y;
  74. let movePoint = { X: moveX, Y: moveY };
  75. this.points.push(movePoint); //存点
  76. let len = this.points.length;
  77. if (len >= 2) {
  78. this.draw(); //绘制路径
  79. }
  80. },
  81. // 触摸结束,将未绘制的点清空防止对后续路径产生干扰
  82. touchend() {
  83. this.points = [];
  84. },
  85. //绘制笔迹
  86. draw() {
  87. let point1 = this.points[0];
  88. let point2 = this.points[1];
  89. this.points.shift();
  90. this.ctx.moveTo(point1.X, point1.Y);
  91. this.ctx.lineTo(point2.X, point2.Y);
  92. this.ctx.stroke();
  93. this.ctx.draw(true);
  94. },
  95. //清空画布
  96. clear() {
  97. let that = this;
  98. uni.getSystemInfo({
  99. success: function(res) {
  100. let canvasw = res.windowWidth;
  101. let canvash = res.windowHeight;
  102. that.ctx.clearRect(0, 0, canvasw, canvash);
  103. that.ctx.draw(true);
  104. }
  105. });
  106. },
  107. //完成绘画并保存到本地
  108. saveCanvasImg() {
  109. let that = this;
  110. //#ifdef MP-WEIXIN
  111. wx.canvasToTempFilePath({
  112. canvasId: 'mycanvas',
  113. fileType: 'png',
  114. quality: 1, //图片质量
  115. success(res) {
  116. console.log(res.tempFilePath, 'canvas生成图片地址');
  117. that.$emit('saveCanvasImg',res.tempFilePath);
  118. that.$emit('closeCanvas');
  119. that.close();
  120. },
  121. fail(e) {
  122. console.log(e)
  123. },
  124. complete(e) {
  125. console.log(e)
  126. }
  127. },this);
  128. //#endif
  129. uni.canvasToTempFilePath({
  130. canvasId: 'mycanvas',
  131. success: function(res) {
  132. console.log(res);
  133. // that.SignatureImg = res.tempFilePath;
  134. that.$emit('saveCanvasImg',res.tempFilePath);
  135. that.$emit('closeCanvas');
  136. that.close();
  137. }
  138. });
  139. /* uni.canvasToTempFilePath(
  140. {
  141. canvasId: 'mycanvas',
  142. success: function(res) {
  143. console.log(res);
  144. that.SignatureImg = res.tempFilePath;
  145. that.$emit('saveCanvasImg','aaa');
  146. }
  147. },
  148. ); */
  149. }
  150. },
  151. mounted() {
  152. this.createCanvas();
  153. }
  154. };
  155. </script>
  156. <style scoped>
  157. .signature-box {
  158. /* display: flex;
  159. flex-direction: column;
  160. align-items: center;
  161. background: #fff; */
  162. /* 签名模块 */
  163. }
  164. .sign-wrap{
  165. margin: 0 auto;
  166. height: 100%;
  167. background: #F0F0F0;
  168. /* position: fixed; */
  169. /* top: 0px; */
  170. z-index: 10080;
  171. width: 100%;
  172. }
  173. .signature {
  174. }
  175. .signature-title{
  176. background: #fff;
  177. border-bottom: 1px solid #19BE6B;
  178. line-height: 36px;
  179. text-align: center;
  180. font-size: 16px;
  181. }
  182. .mycanvas {
  183. width: 100%;
  184. /* height: calc(100vh - 200upx); */
  185. height: 140px;
  186. background-color: #fff;
  187. }
  188. /* 底部按钮 */
  189. .footer {
  190. font-size: 14px;
  191. height: 150upx;
  192. display: flex;
  193. justify-content: space-around;
  194. align-items: center;
  195. }
  196. /* 生成的图片 */
  197. .SignatureImg {
  198. background: #fff;
  199. }
  200. .SignatureImg image{
  201. width: 750rpx;
  202. height: 750rpx;
  203. }
  204. </style>
  205. <style>
  206. page {
  207. background: #fbfbfb;
  208. /* height: auto; */
  209. /* overflow: hidden; */
  210. }
  211. .wrapper {
  212. width: 100%;
  213. height: 95vh;
  214. margin: 30rpx 0;
  215. overflow: hidden;
  216. display: flex;
  217. align-content: center;
  218. flex-direction: row;
  219. justify-content: center;
  220. font-size: 28rpx;
  221. }
  222. .handWriting {
  223. background: #fff;
  224. width: 100%;
  225. height: 95vh;
  226. }
  227. .handRight {
  228. display: inline-flex;
  229. align-items: center;
  230. }
  231. .handCenter {
  232. border: 4rpx dashed #e9e9e9;
  233. flex: 5;
  234. overflow: hidden;
  235. box-sizing: border-box;
  236. }
  237. .handTitle {
  238. transform: rotate(90deg);
  239. flex: 1;
  240. color: #666;
  241. }
  242. .handBtn button {
  243. font-size: 28rpx;
  244. }
  245. .handBtn {
  246. height: 95vh;
  247. display: inline-flex;
  248. flex-direction: column;
  249. justify-content: space-between;
  250. align-content: space-between;
  251. flex: 1;
  252. }
  253. .delBtn {
  254. position: absolute;
  255. top: 250rpx;
  256. left: 0rpx;
  257. transform: rotate(90deg);
  258. color: #666;
  259. }
  260. .delBtn image {
  261. position: absolute;
  262. top: 13rpx;
  263. left: 25rpx;
  264. }
  265. .subBtn {
  266. position: absolute;
  267. bottom: 52rpx;
  268. left: -3rpx;
  269. display: inline-flex;
  270. transform: rotate(90deg);
  271. background: #008ef6;
  272. color: #fff;
  273. margin-bottom: 30rpx;
  274. text-align: center;
  275. justify-content: center;
  276. }
  277. /*Peach - 新增 - 保存*/
  278. .saveBtn {
  279. position: absolute;
  280. top: 375rpx;
  281. left: 0rpx;
  282. transform: rotate(90deg);
  283. color: #666;
  284. }
  285. .previewBtn {
  286. position: absolute;
  287. top: 500rpx;
  288. left: 0rpx;
  289. transform: rotate(90deg);
  290. color: #666;
  291. }
  292. .uploadBtn {
  293. position: absolute;
  294. top: 625rpx;
  295. left: 0rpx;
  296. transform: rotate(90deg);
  297. color: #666;
  298. }
  299. /*Peach - 新增 - 保存*/
  300. .black-select {
  301. width: 60rpx;
  302. height: 60rpx;
  303. position: absolute;
  304. top: 30rpx;
  305. left: 25rpx;
  306. }
  307. .black-select.color_select {
  308. width: 90rpx;
  309. height: 90rpx;
  310. top: 100rpx;
  311. left: 10rpx;
  312. }
  313. .red-select {
  314. width: 60rpx;
  315. height: 60rpx;
  316. position: absolute;
  317. top: 140rpx;
  318. left: 25rpx;
  319. }
  320. .red-select.color_select {
  321. width: 90rpx;
  322. height: 90rpx;
  323. top: 120rpx;
  324. left: 10rpx;
  325. }
  326. </style>