微信小程序用 canvas 实现手写签名弹框(全网最最最详细!!)

这篇具有很好参考价值的文章主要介绍了微信小程序用 canvas 实现手写签名弹框(全网最最最详细!!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、签字面板效果图

微信小程序 手写签名,微信小程序,canva可画微信小程序 手写签名,微信小程序,canva可画

二、WXML文件

🌸点击弹出手写签名面板事件

<van-button type="default" bindtap="handWrittenSign">点击弹出手写签名弹框</van-button>

🌸手写签名面板 Popup 弹出层(vant

<van-popup show="{{ showWritten }}" position="bottom" custom-class="writtenArea" bind:close="writtenSignClose">
    <view class="agree-area">
        <text>请签字以确认同意用户服务协议</text>
    </view>
    <canvas type="3d" canvas-id="myCanvas" bindtouchstart="onTouchStart" bindtouchmove="onTouchMove" bindtouchend="onTouchEnd" class="canvas-area"></canvas>
    <view class="written-btn-area">
        <van-button type="default" custom-class="write" bindtap="resetWrite" size="small">重置</van-button>
        <van-button plain type="info" custom-class="write" bindtap="cancelWrite" size="small">取消</van-button>
        <van-button type="info" custom-class="write" bindtap="confirmWrite" size="small">确认</van-button>
    </view>
</van-popup>

三、JS文件

Page({
	/**
     * 页面的初始数据
     */
    data: {
        showWritten: false,  //展示手写签名弹框
        startX: undefined, // 线条的坐标点
        startY: undefined,
        userSignatureId: undefined, // 签名图片id
        screenWidth: undefined, // 屏幕宽
        screenHeight: undefined, // 屏幕高
    },
	
	/**
     * 事件
     */
	
	// 点击弹出手写签名弹框
	handWrittenSign() {
        this.setData({ showWritten: true });
        this.initCanvas();
    },
	
	// 点击蒙层关闭弹框
	writtenSignClose() {
        this.setData({ showWritten: false });
        this.resetWrite();
    },

	// 初始化画布
	initCanvas() {
        const context = wx.createCanvasContext('myCanvas', this);
        context.setStrokeStyle('#000'); // 设置线条样式
        context.setLineWidth(3); // 线条粗细
        context.setLineCap('round'); // 设置线条端点样式
        context.setLineJoin('round'); // 设置线条交点样式(拐角)
        context.beginPath(); // 开始新的绘制路径
        context.clearRect(0, 0, this.data.startX, this.data.startY); // 清除画布上的内容
        context.draw(); // 绘制到canvas上
    },

	// 手指触摸动作开始
	onTouchStart(e) {
        const context = wx.createCanvasContext('myCanvas', this);

        context.setStrokeStyle('#000000');
        context.setLineWidth(3);

        this.setData({
            'startX': e.touches[0].x,
            'startY': e.touches[0].y,
        })
    },

	// 手指触摸后移动
	onTouchMove(e) {
        const context = wx.createCanvasContext('myCanvas', this);
        
        context.moveTo(this.data.startX, this.data.startY);
        context.lineTo(e.touches[0].x, e.touches[0].y);
        context.stroke();
        context.draw(true);
        
        this.setData({
            'startX': e.touches[0].x,
            'startY': e.touches[0].y,
        })
    },

	// 手指触摸动作结束
	onTouchEnd() {
        const context = wx.createCanvasContext('myCanvas', this);
        context.closePath();
        context.draw(true);
    },

	// 重置签名
    resetWrite() {
        const context = wx.createCanvasContext('myCanvas', this);
        let { screenWidth, screenHeight } = this.data;
        // 清空画布
        context.clearRect(0, 0, screenWidth, screenHeight);
        context.beginPath();
        // 绘制白色背景
        context.setFillStyle('#ffffff'); // 填充色 白色
        context.fillRect(0, 0, screenWidth, screenHeight); // 绘制一个矩形清除画布内容
        context.setLineWidth(3);  // 线条粗细
        // 绘制提示文字(根据需求可要可不要)
        context.setFontSize(14);
        context.setFillStyle('#999999');
        context.setTextAlign('center');
        context.fillText('请在此区域签名', this.data.startX / 2, this.data.startY / 2);
        // 绘制到canvas上
        context.draw();
    },

	// 取消签名
    cancelWrite() {
		this.setData({ 
            showWritten: false
        })
        const context = wx.createCanvasContext('myCanvas', this);
        let { screenWidth, screenHeight } = this.data;
         // 清空画布
        context.clearRect(0, 0, screenWidth, screenHeight);
        context.beginPath();
        context.setFillStyle('#ffffff');
        context.fillRect(0, 0, screenWidth, screenHeight);
        context.setLineWidth(3);
        // 绘制到canvas上
        context.draw();
    },
  
  	// 确认提交
    confirmWrite() {
		this.setData({showWritten: false});  // 关闭手写面板
        wx.canvasToTempFilePath({
            canvasId: 'myCanvas',
            success: function(res) {
              const tempFilePath = res.tempFilePath; // 取图片文件路径
              // 将 tempFilePath 传递给后端接口
    		  uploadFile({fileType: 'image', tempFilePath: tempFilePath})
                .then(file => {
                // 由于签名面板在表单中,提交表单需要传签名文件id,在这里赋值
                    that.setData({ userSignatureId: file.id })
                })
                .catch(err => {
                    console.error(err)
                })
            }
        });
    },  
	
	/**
     * 生命周期函数--监听页面显示
     */
    onShow() {
        // 获取屏幕的宽高 可结合画布在父元素的百分比获取实际宽高度;若画布为固定值,以上所用宽高度可不用在此获取,直接写死即可。
        const systemInfo = wx.getSystemInfoSync();
        this.setData({
            screenWidth: systemInfo.screenWidth,
            screenHeight: systemInfo.screenHeight
        })
    },
})

🌸最后可以使用 canvas 组件的 toTempFilePath 方法将 canvas 画布内容保存为临时文件路径,然后将该路径传递给后端即可。

四、WXSS文件

.writtenArea {
    height: 60%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-direction: column;
}

.canvas-area {
    width: 90%;
    flex: 1;
    border: 1px solid #ccc;
}

.write {
    width: 180rpx;
}

.written-btn-area {
    width: 100%;
    display: flex;
    justify-content: space-between;
    padding: 0 40rpx;
    margin-top: 20rpx;
}

.agree-area {
    width: 90%;
    margin: 20rpx 0;
    text-align: left;
    font-size: 36rpx;
    font-weight: 700;
}

五、小Tips ~

💡 文中触摸板的方法中多次获取canvas的上下文,即const context = wx.createCanvasContext('myCanvas', this);,我这里是直接在函数内部定义方法,内部使用。也可全局定义,使用wx.createCanvasContext 获取绘图上下文 context全局使用,如下:

Page({
  data: {
    canvasContext: null // canvas上下文对象
  },
  
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    this.data.canvasContext = wx.createCanvasContext('myCanvas', this);
  },
  // ...
})

六、IOS会遇到的问题及如何解决

🌸微信小程序给出的解决方案:
微信小程序 手写签名,微信小程序,canva可画文章来源地址https://www.toymoban.com/news/detail-753774.html

到了这里,关于微信小程序用 canvas 实现手写签名弹框(全网最最最详细!!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序手写签名

    wxml js wxss 开启横屏 json

    2024年02月08日
    浏览(30)
  • 微信小程序实现各类弹框、自定义弹框

    目录 wx.showModal  wx.showToast wx.showLoading wx.showActionSheet 自定义弹框 功能介绍:常用于显示需用户操作的信息框,用户可进行确认、取消或输入内容。 常用参数介绍: title:提示的标题: content:提示的内容: showCancel:是否显示取消按钮 cancelText:取消按钮的文字 confirmText:

    2024年01月18日
    浏览(42)
  • 微信小程序实现canvas画圆形微信头像

    1.需要获取用户信息,拿到用户头像图片 2.实例化一个canvas对象,绘制出圆形并将头像固定到圆形中心位置 3.实现效果      

    2024年02月15日
    浏览(25)
  • 微信小程序--canvas画布实现图片的编辑

    上传图片,编辑图片大小,添加文字,改变文字颜色等 微信小程序--canvas画布实现图片的编辑 软件环境:微信开发者工具 官方下载地址:微信开发者工具下载地址与更新日志 | 微信开放文档 1、基本需求。 实现上传图片 实现图片编辑 实现添加文字 实现导出图片 2、案例目录

    2024年02月05日
    浏览(31)
  • 微信小程序使用 canvas 2d 实现签字板组件

    本文是在微信小程序中使用 canvas 2d 来实现签字板功能; 效果图: 代码: 1、wxml 2、js 3、总结 canvas 的宽度和高度可以写死,也可以根据当前可是区域动态计算;需要注意的是 res[0].node 的宽度和高度的计算是当前 canvas 元素上的宽度和高度乘设备的 pixelRatio ;

    2024年02月09日
    浏览(28)
  • uniapp写微信小程序实现电子签名

    写电子签名一定要注意的是一切全部按照手机上的适配来,为啥这么说呢,因为你在微信开发者工具中调试的时候认为是好的,正常的非常nice,当你发布版本的时候你会发现问题出来了。我下边的写法你可以直接用很简单。就是要记住canvas的几个属性和用法。 直接上干货 1.签

    2024年01月18日
    浏览(36)
  • 微信小程序实现输入内容生成二维码(canvas)

    1.封装好的QRcode的js文件 2.在我们需要使用的页面的js文件中引入该文件  效果如下:  3.首先在wxml中书写 canvas标签 4.先声明一个方法来解决中文乱码的问题 5.当我们文本域的值发生改变时,也要渲染到视图层 需求: 当我们文本框输入内容时,点击以下的生成二维码按钮,下

    2024年02月16日
    浏览(32)
  • 微信小程序canvas画图案列,实现生成头像并保存,小程序新版canvas变化,小程序中canvas注意事项

    你一定见过很多制作头像的小程序,无论是国庆的红旗,圣诞的帽子,还是疫情的口罩,都可以用小程序生成应景的头像,那么具体的代码是怎么实现的呢?前些天帮别人做了一个生成姓氏头像的功能,里面的实现原理基本一致,都是通过Canvas实现,以生成姓氏头像为例,记录一下小程序的

    2024年02月09日
    浏览(39)
  • 微信小程序中使用画布canvas实现动态心电图绘制

    大家好,我是雄雄。 近期,接了个项目,三端(小程序、PC、公众号)同步开发,PC端没的问题,以前一直做的就是PC端,但是小程序和公众号之前没有做过,只能通过这个项目,边做边学了。 人家都说小程序用原生的特别难,大部分都用 uniapp 开发,说是这个方便快捷,还能

    2024年02月09日
    浏览(28)
  • 使用taro+canvas实现微信小程序的图片分享功能

    二轮充电业务中,用户充电完成后在订单详情页展示订单相关信息,用户点击分享按钮唤起微信小程序分享菜单,将生成的图片海报分享给微信好友或者下载到本地,好友可通过扫描海报中的二维码加群领取优惠。 使用场景及功能:微信小程序 生成海报图片 分享好友 下载图

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包