index.wxml

<canvas type="2d" id="canvas" bindtouchmove="move" bindtouchstart="start"  binderror="error" style="width:{{width}}px;height:{{height}}px;"></canvas>
<view class="btn">
<button bindtap="clearClick">重签</button>
<button bindtap="saveClick">完成签名</button>
</view>

index.wxss

page {
background-color: #e9f2f1;
}
.btn {
display: flex;
flex-direction: row;
justify-self: baseline;
margin: 15rpx; }
.btn button:first-child {
color: #3fa89a;
}
.btn button:last-child {
color: white;
background-color: #3fa89a;
}
button {
width: 200rpx;
border-radius: 5rpx;
box-shadow: 0px 0px 1px 1px #c5c5c5;
}
canvas {
background-color: white;
}

index.json

{
"usingComponents": {},
"pageOrientation": "landscape",
"navigationBarBackgroundColor":"#3fa89a",
"navigationBarTextStyle":"white",
"navigationBarTitleText":"手写签名"
}

index.js

const app = getApp()
Page({
data: {
canvas: '',
ctx: '',
pr:0,
width: 0,
height: 0,
first:true,
},
start(e) {
if(this.data.first){
this.clearClick();
this.setData({first:false})
}
this.data.ctx.beginPath(); // 开始创建一个路径,如果不调用该方法,最后无法清除画布
this.data.ctx.moveTo(e.changedTouches[0].x, e.changedTouches[0].y) // 把路径移动到画布中的指定点,不创建线条。用 stroke 方法来画线条
},
move(e) {
this.data.ctx.lineTo(e.changedTouches[0].x, e.changedTouches[0].y) // 增加一个新点,然后创建一条从上次指定点到目标点的线。用 stroke 方法来画线条
this.data.ctx.stroke()
},
error: function (e) {
console.log("画布触摸错误" + e);
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function () {
this.getSystemInfo()
this.createCanvas()
},
/**
* 初始化
*/
createCanvas() {
const pr = this.data.pr; // 像素比
const query = wx.createSelectorQuery();
query.select('#canvas').fields({ node: true, size: true }).exec((res) => {
const canvas = res[0].node;
const ctx = canvas.getContext('2d');
canvas.width = this.data.width*pr; // 画布宽度
canvas.height = this.data.height*pr; // 画布高度
ctx.scale(pr,pr); // 缩放比
ctx.lineGap = 'round';
ctx.lineJoin = 'round';
ctx.lineWidth = 4; // 字体粗细
ctx.font = '40px Arial'; // 字体大小,
ctx.fillStyle = '#ecf0ef'; // 填充颜色
ctx.fillText('签名区', res[0].width / 2 - 60, res[0].height / 2)
this.setData({ ctx, canvas })
})
},
// 获取系统信息
getSystemInfo() {
let that = this;
wx.getSystemInfo({
success(res) {
that.setData({
pr:res.pixelRatio,
width: res.windowWidth,
height: res.windowHeight - 75,
})
}
})
},
clearClick: function () {
//清除画布
this.data.ctx.clearRect(0, 0, this.data.width, this.data.height);
},
//保存图片
saveClick: function () {
wx.canvasToTempFilePath({
x: 0,
y: 0,
width: this.data.width,
height: this.data.height,
destWidth:this.data.width*this.data.pr,
destHeight: this.data.height*this.data.pr,
canvasId: 'canvas',
canvas: this.data.canvas,
fileType: 'png',
success(res) {
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success(res) {
wx.showToast({
title: '保存成功',
icon: 'success'
})
}
})
}
})
}
})

原文链接:https://www.cnblogs.com/bxmm/p/15257401.html

手写签名-微信小程序的更多相关文章

  1. 微信小程序——手把手教你写一个微信小程序

    前言 微信小程序年前的跳一跳确实是火了一把,然后呢一直没有时间去实践项目,一直想搞但是工作上不需要所以,嗯嗯嗯嗯嗯emmmmm..... 需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 ...

  2. 用Taro写一个微信小程序(一)——开始一个项目

    一.Taro简介 1.名字由来 Taro['tɑ:roʊ],泰罗·奥特曼,宇宙警备队总教官,实力最强的奥特曼. 2.taro是什么 Taro 是一个开放式跨端跨框架解决方案,支持使用 React/Vu ...

  3. 手摸手教你微信小程序开发之自定义组件

    前言 相信大家在开发小程序时会遇到某个功能多次使用的情况,比如弹出框.这个时候大家首先想到的是组件化开发,就是把弹出框封装成一个组件,然后哪里使用哪里就调用,对,看来大家都是有思路的人,但是要怎样实现 ...

  4. 自己写的微信小程序炸金花简单版

    app.json: { "pages":[ "pages/index/index" ], "window":{ "navigati ...

  5. 用Taro写一个微信小程序(二)——配置目录别名

    配置别名可以方便书写代码引用路径,让代码更整洁. 官方文档可参考https://nervjs.github.io/taro/docs/config-detail#alias 一.在config/ind ...

  6. 用Taro写一个微信小程序(三)—— 配置dva

    一.关于dva dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻 ...

  7. mpvue-编写微信小程序总结

    一.写在前面: .....最近在写一个微信小程序项目,在看完官方微信小程序开发文档后,有一种直接想"放弃"的念头: .....使用微信小程序原生框架可以快速,方便,简洁的搭建项目, ...

  8. 微信小程序火车票查询 直取12306数据

    最终效果图: 样式丑哭了,我毕竟不是前端,宗旨就是练练手,体验微信小程序的开发,以最直接的方式获取12306数据查询火车票. 目录结构: search1是出发站列表,search2是目的站列表,命名没 ...

  9. 微信小程序之ES6与事项助手

    由于官方IDE更新到了0.11.112301版本,移除了对Promise的支持,造成事项助手不能正常运行,解决此问题,在项目中引入第三方兼容库Bluebird支持Promise,代码已经整合到项目代码 ...

  10. 与大家分享学习微信小程序开发的一些心得

    因为我也才开始学习微信小程序不久,下文也是现在的一时之言,大家有不同的想法也可以在评论里共同交流讨论,希望文章能给大家提供一点点帮助. 最近接触到了一些前端框架,像Vue.js,React,发现小程序 ...

随机推荐

  1. [C++]STL - 队列(Queue) 栈(Stack) 链表(list)

    STL - 队列(Queue) 栈(Stack) 链表(list) Queue 队列 结构特征 这是一种线性储存结构 其数据有先进先出的特点 这种特点被称为FIFO(First In First Ou ...

  2. OpenGL 着色器详解

    1. GLSL语言 glsl语言是用来编写着色器的,通过一段一段包含main函数的程序片段,告诉渲染引擎怎么去渲染内容. glsl语言的语法有点类似c语言风格,只是增加了一些特有的关键字来修饰变量,下 ...

  3. 推荐一个 AI 绘图工具!将草图变成精美的图片!

    大家好,我是 Java陈序员. 要说 2023 年科技圈什么最火,当属 ChatGPT!自从 ChatGPT 爆火之后,各种 AI 工具层出不穷.AI 对话.AI 写文案.AI 写代码..... 今天 ...

  4. 栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式

    1 //1.实现对逆波兰输入的表达式进行计算如(2-1)*(2+3)= 5 就输入2 1 - 2 3 + * //先把2 1 压栈 遇到-弹栈 再把2 3压进去 遇到+弹栈 最后遇到*弹栈 2 //2 ...

  5. 哈希表(hash)

    散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (141)-- 算法导论12.1 1题

    一.用go语言,对于关键字集合(1,4,5,10,16,17,21),分别画出高度为 2.3.4.5和6的二又搜索树. 文心一言: 以下是用Go语言为给定的关键字集合(1, 4, 5, 10, 16, ...

  7. 用友U8和旺店通·企业奇门单据接口对接

    用友U8和旺店通·企业奇门单据接口对接 对接系统旺店通·企业奇门 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化 ...

  8. timeSetEvent()函数定时器的使用

    1.定时器函数的使用 微软公司在其多媒体Windows中提供了精确定时器的底层API支持,利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一个事件.函数或过程的调用. ...

  9. 小傅哥带着你做 Java SDK 组件

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. 今天小傅哥将开启一个新计划,带着大家一起干"开源&q ...

  10. Unicode编码解码

    一.Unicode概述 Unicode是一种字符编码标准,旨在解决不同字符集之间的兼容性问题.它为全球所有语言提供了一种统一的编码方式,使得各种字符能够在计算机系统中正确显示和处理.Unicode字符 ...