热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

返回清空完成签名板 /* pages/page/cvsAutograph/cvsAutograph.wxss */page {background: #fbfbfb;height: auto;over


签名板

/* pages/page/cvsAutograph/cvsAutograph.wxss */
page {background: #fbfbfb;height: auto;overflow: hidden;
}
canvas {
width:100%;
/* height:100%; */
}.wrapper {width: 100%;height: 95vh;margin: 30rpx 0;overflow: hidden;display: flex;align-content: center;flex-direction: row;justify-content: center;font-size: 28rpx;
}/* .handWriting {background: #fff;width: 100%;height: 95vh;
} */.handRight {display: inline-flex;align-items: center;
}.handCenter {position: relative;border: 4rpx dashed #e9e9e9;flex: 5;overflow: hidden;box-sizing: border-box;
}
.overImg{position: absolute;top: 0;left: 0;background-color: #fff;
}.handTitle {transform: rotate(90deg);flex: 1;color: #666;
}.handBtn button {font-size: 28rpx;
}.handBtn {height: 95vh;display: inline-flex;flex-direction: column;justify-content: space-between;align-content: space-between;flex: 1;
}
.backBtn{position: absolute;top: 50rpx;left: 0rpx;transform: rotate(90deg);color: #666;
}
.delBtn {position: absolute;top: 250rpx;left: 0rpx;transform: rotate(90deg);color: #666;
}.subBtn {position: absolute;bottom: 52rpx;left: -3rpx;display: inline-flex;transform: rotate(90deg);background: #008ef6;color: #fff;margin-bottom: 30rpx;text-align: center;justify-content: center;
}

// canvas 全局配置
var context = null;// 使用 wx.createContext 获取绘图上下文 context
var arrx = [];//所有点的X轴集合
var arry = [];//所有点的Y轴集合
var canvasw = 0;//画布的宽
var canvash = 0;//画布的高
var top = 0;
var left = 0;
let app = getApp();
//注册页面
Page({canvasIdErrorCallback: function (e) {console.error(e.detail.errMsg)},//绘制之前canvasStart: function (event) {arrx.push(event.changedTouches[0].x);arry.push(event.changedTouches[0].y);//就算点击之后手指没有移动,那么下次要移动之前还是必定会先触发这个},//手指移动过程canvasMove: function (event) {context.moveTo(arrx[arrx.length - 1], arry[arrx.length - 1])arrx.push(event.changedTouches[0].x);arry.push(event.changedTouches[0].y);context.lineTo(event.changedTouches[0].x, event.changedTouches[0].y);context.setLineWidth(4);//设置线条的宽度context.setLineCap('round');//设置结束时 点的样式context.stroke();//画线context.draw(true);//设置为true时,会保留上一次画出的图像,false则会清空},//手指离开canvasEnd: function (event) {},cleardraw: function () {//清除画布arrx = [];arry = [];// arrz = [];context.clearRect(0, 0, canvasw, canvash);context.draw(false);this.setData({cvsHeight: "100%",src:''})},//导出图片getimg: function () {if (arrx.length == 0) {wx.showModal({title: '提示',content: '签名内容不能为空!',showCancel: false});return false;};wx.showLoading({title: '签名生成中..',mask:true})let that = this;//先拿到竖着的地址给image,挡住下面的操作!wx.canvasToTempFilePath({canvasId: 'canvas',// width: canvasw,// height: canvash,// destWidth: canvasw,// destHeight: canvasw * canvasw / canvash,success: function (res) {//把当前的图片放上去挡住,接着操作下面的canvasthat.setData({src: res.tempFilePath,cvsHeight: canvasw * canvasw / canvash})context.clearRect(0, 0, canvasw, canvash);context.translate(0, canvasw/2.4);context.rotate(270 * Math.PI / 180);context.drawImage(res.tempFilePath, 0, 0,canvasw * canvasw / canvash, canvasw);context.draw(false, setTimeout(function () {wx.canvasToTempFilePath({canvasId: 'canvas',success: result => {console.log(result.tempFilePath);//转成base64wx.getFileSystemManager().readFile({ filePath: res.tempFilePath, //选择图片返回的相对路径encoding: 'base64', //编码格式success: result => { //成功的回调let base64 = result.data; }}) //全局变量,用于返回显示app.globalData.pages.cvsAutograph.autograph = result.tempFilePath;wx.navigateTo({url: '../index/index'})wx.hideLoading()}}, this)}, 100))}})},/*** 页面的初始数据*/data: {src: "",cvsHeight:'100%',},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {wx.showLoading({title: '加载中...',mask: true})// 使用 wx.createContext 获取绘图上下文 contextcontext = wx.createCanvasContext('canvas');context.beginPath();var query = wx.createSelectorQuery();query.select('.handCenter').boundingClientRect(rect => {top = rect.top;left = rect.left;canvasw = rect.width;canvash = rect.height;wx.hideLoading()}).exec();}
})

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


推荐阅读
  • 如何构建并优化微信小程序页面的设计与功能
    本文将深入探讨微信小程序页面的设计与优化方法,旨在帮助开发者高效构建功能完备且用户体验良好的小程序。通过实例分析与技术详解,读者能够掌握从页面布局到功能实现的全过程,提升开发技能与应用质量。 ... [详细]
  • 在本文中,我们将探讨如何使用 UniApp 封装小程序 API 请求接口的最佳实践。通过创建 `request.js` 文件,定义基础 URL 并传入后端提供的 URL 作为请求参数。同时,配置请求方法(如 GET、POST)和请求头(例如包含 token 的认证信息),以实现高效、安全的 API 调用。此外,我们还将介绍如何处理请求和响应的错误,以及如何优化请求性能,确保应用在不同平台上的兼容性和稳定性。 ... [详细]
  • 本文深入探讨了Android事件分发机制的源代码,重点分析了DecorView作为Activity根布局的角色及其在事件传递中的作用。同时,详细解析了PhoneWindow在Activity窗口管理中的关键功能,以及它如何与DecorView协同工作,确保用户交互事件的高效处理。 ... [详细]
  • 本文介绍了Android动画的基本概念及其主要类型。Android动画主要包括三种形式:视图动画(也称为补间动画或Tween动画),主要通过改变视图的属性来实现动态效果;帧动画,通过顺序播放一系列预定义的图像来模拟动画效果;以及属性动画,通过对对象的属性进行平滑过渡来创建更加复杂的动画效果。每种类型的动画都有其独特的应用场景和实现方式,开发者可以根据具体需求选择合适的动画类型。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 探讨 `org.openide.windows.TopComponent.componentOpened()` 方法的应用及其代码实例分析 ... [详细]
  • 深入解析Spring Boot自动配置机制及其核心原理
    Spring Boot 的自动配置机制是其核心特性之一,旨在简化开发过程并提高效率。本文将深入探讨这一机制的工作原理,解释其如何通过智能化的类路径扫描和条件注解实现自动装配。通过对 Spring Boot 自动配置的详细解析,读者将能够更好地理解和应用这一强大功能,从而在实际项目中更加高效地利用 Spring Boot。 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
  • 深入解析 javax.faces.view.ViewDeclarationLanguageWrapper.getWrapped() 方法及其应用实例 ... [详细]
  • 手机上编写和运行PHP代码的最佳软件推荐 ... [详细]
  • 如何在datetimebox中进行赋值与取值操作
    在 datetimebox 中进行赋值和取值操作时,可以通过以下方法实现:使用 `$('#j_dateStart').datebox('setValue', '指定日期')` 进行赋值,而通过 `$('#j_dateStart').datebox('getValue')` 获取当前选中的日期值。若需要清空日期值,可以使用 `$('#j_dateStart').datebox('clear')` 方法。这些操作能够确保日期控件的准确性和灵活性,适用于各种前端应用场景。 ... [详细]
  • CSS3 实现鼠标悬停时滚动菜单的流畅过渡效果 ... [详细]
  • 如何在UniApp中实现顶部导航栏的按钮与搜索框显示功能
    本文介绍了如何用uni-app实现顶部导航栏显示按钮和搜索框,感兴趣的同学,可以参 ... [详细]
author-avatar
je荒也是种美
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有