【项目难点】小程序使用canvas实现电子签名功能(简易版)

16 篇文章 0 订阅
7 篇文章 0 订阅

因为这是个简易版,所以代码行数不多,直接贴上代码再看。

<template>
    <view class="main-container">

        <view class="main-left"  @touchmove='touchMove' @touchstart='touchStart' @touchend='touchEnd'>
            <canvas class="left-canvas-area"  canvas-id="signature-box"></canvas>
        </view>
        <view class="main-right">
            <button class="right-btn-reset" @click="resetHandler">重置</button>
            <button class="left-btn-save" @click="saveHandler">保存</button>
        </view>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                ctx:{},
                x:0,
                y:0,
                count:0
            }
        },
        methods: {
            touchMove(e){
                this.ctx.setFillStyle('#111111')
                this.ctx.arc(e.touches[0].pageX,e.touches[0].pageY,5,0,2*Math.PI)
                this.ctx.fill()
                this.ctx.draw(true)
                this.ctx.stroke()
                this.ctx.draw(true)
            },
            touchStart(e){
                console.log('start->',e.touches[0].pageX,e.touches[0].pageY)
                this.x = e.touches[0].pageX
                this.y = e.touches[0].pageY
                this.ctx.moveTo(this.x,this.y)
            },
            touchEnd(e){
                console.log('end',e)
            },
            resetHandler(){
                this.ctx.clearRect(0,0,1000,1000)
                this.ctx.draw()
            },
            saveHandler(){
                wx.canvasToTempFilePath({
                    canvasId: 'signature-box',
                    fileType: 'jpg',
                    quality: 1,
                    success: (res) => {
                        wx.saveImageToPhotosAlbum({
                            filePath: res.tempFilePath,
                            success: () => {
                                console.log('保存成功')
                            },
                            fail: () => {},
                            complete: () => {}
                        })
                    },
                    fail: () => {},
                    complete: () => {}
                })
            }
        },
        onShow(){
            this.ctx = wx.createCanvasContext('signature-box')
        }
    }
</script>

<style lang="scss">
.main-left{
    position:fixed;
    top:0;
    width: 100vw;
    height:80vh;
    
}
.left-canvas-area{
    width: 100%;
    height: 100%;
}
.main-right{
    position: fixed;
    top: 80vh;
    left: 0;
    height: 20vh;
    width: 100vw;
}
</style>

主要是理解小程序或者移动端的三个事件,touchstart、touchmove、touchend。可以参考这篇文章
绑定事件以后,直接传入事件的参数,然后可以从事件里面拿到触点位置信息,进行绘制即可。
要注意以下几点:
1、如果使用lineTo的方法,一定要记得在touchstart时跟着把绘制的焦点moveTo到触点上,不然会画出从左上角拉下来的直线。
这里我是用arc的方法来实现的,就是一旦位移就以其触点为圆心画圆,虽然也是实现了,但在移速快的情况下会出现点之间不连续,推荐使用lineTo的方法来实现。
2、一般来讲还要配置一个重置功能,使用clearRect来处理就可以了。
3、在画的时候,一定要用draw(true),不然每次画都会把上次的刷新掉。

在这里插入图片描述
这里样式就不调了,因为没有应用到具体功能上,而且正确的使用方式应该是把手机横过来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以使用Canvas实现微信小程序签名功能。以下是实现步骤: 1. 在wxml文件中添加Canvas标签,设置宽高和id属性,如: ```html <canvas canvas-id="myCanvas" style="width: 100%; height: 100%;"></canvas> ``` 2. 在相应的js文件中获取Canvas对象,如: ```javascript const ctx = wx.createCanvasContext('myCanvas') ``` 3. 监听touch事件,获取坐标并在Canvas上绘制线条,如: ```javascript let startX = 0 let startY = 0 let moveX = 0 let moveY = 0 let drawing = false wx.createSelectorQuery().select('#myCanvas').fields({ node: true, size: true }).exec((res) => { const canvas = res[0].node const ctx = canvas.getContext('2d') canvas.addEventListener('touchstart', (e) => { startX = e.touches[0].x startY = e.touches[0].y drawing = true }) canvas.addEventListener('touchmove', (e) => { if (!drawing) { return } moveX = e.touches[0].x moveY = e.touches[0].y ctx.beginPath() ctx.moveTo(startX, startY) ctx.lineTo(moveX, moveY) ctx.stroke() startX = moveX startY = moveY }) canvas.addEventListener('touchend', () => { drawing = false }) }) ``` 4. 在需要保存签名的地方调用Canvas对象的toTempFilePath方法,如: ```javascript wx.canvasToTempFilePath({ canvasId: 'myCanvas', success: (res) => { console.log(res.tempFilePath) } }) ``` 至此,签名功能实现了。需要注意的是,Canvas是一个像素级别的绘图工具,需要自己处理每一个像素点的绘制,所以在实现时需要注意性能和体验问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值