微信小程序使用 canvas 2d 实现签字板组件

news2024/9/20 16:57:20

本文是在微信小程序中使用 canvas 2d 来实现签字板功能;

效果图:
请添加图片描述
代码:
1、wxml

<view>
  <canvas 
  id="canvas"
  type="2d"
  bindtouchstart="start"
  bindtouchmove="move"
  bindtouchend="end"
  style="border: 1px solid #ccc; width:100%; height:800rpx"
  ></canvas>
  <view style="display: flex;">
    <button bindtap="clear">清除</button>
    <button bindtap="save">保存</button>
  </view>
  <image src="{{canvanImg}}"></image>
</view>

2、js

Component({
  properties: {

  },
  data: {
    canvas:null,
    canvanImg:"",
    ctx:null
  },
  lifetimes:{
    ready(){
      let that = this;
      wx.createSelectorQuery().in(this)
      .select("#canvas")
      .fields({
        node:true,
        size:true
      }).exec((res)=>{
        let canvas = res[0].node;
        let ctx = canvas.getContext("2d");
        let dpr = wx.getSystemInfoSync().pixelRatio;
        canvas.width = res[0].width * dpr;
        canvas.height = res[0].height * dpr;
        ctx.fillStyle = "#fff";
        // 利用阴影,消除锯齿
        ctx.shadowBlur = 1;
        ctx.shadowColor = '#000';
        ctx.scale(dpr, dpr)
        that.setData({
          canvas,
          ctx
        })
      })
    }
  },
  methods: {
    //触摸开始
    start (e) {
      this.data.ctx.beginPath()
      this.data.ctx.moveTo(e.touches[0].x,e.touches[0].y)
    },
    //触摸移动
    move (e) {
      this.data.ctx.lineTo(e.touches[0].x, e.touches[0].y)
      this.data.ctx.stroke()//将上下文绘制到canvas中
    },
    //触摸结束
    end (e) {
      this.data.ctx.closePath()
    },
    //清除画布内容
    clear(){
      this.data.ctx.clearRect(0, 0,this.data.canvas.width, this.data.canvas.height)
      this.setData({
          canvanImg:""
      })
    },
    //点击保存生成图片
    save(){
      this.setData({
          canvanImg:this.data.canvas.toDataURL("image/png")
      })
    },
  }
})

3、总结
canvas 的宽度和高度可以写死,也可以根据当前可是区域动态计算;需要注意的是 res[0].node 的宽度和高度的计算是当前 canvas 元素上的宽度和高度乘设备的 pixelRatio ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iphone备份用什么软件?好用的苹果数据备份工具推荐!

众所周知&#xff0c;如果要将iPhone的数据跟电脑进行传输备份的话&#xff0c;我们需要用到iTunes这个pc工具。但是对于iTunes&#xff0c;不少人都反映这个软件比较难用&#xff0c;用不习惯。于是&#xff0c;顺应时代命运的iPhone备份同步工具就出现了。那iphone备份用什么…

VR元宇宙模拟法庭开审体验系统增加学生的参与度和学习效果

元宇宙技术是VR虚拟现实和AR增强现实技术的进一步发展和迭代&#xff0c;它在法治教育中的应用可以突破传统教育的许多限制&#xff0c;让体验者获得更加互动、沉浸和个性化的学习体验。 虚拟法庭&#xff1a; VR元宇宙开发可以模拟虚拟法庭环境&#xff0c;让学生在其中扮演不…

设计师必学!Figma怎么在线保存各种格式图片的操作方法

如今的市场上有许多协作 UI 设计软件可供选择&#xff0c;然而大部分都是国外版本的&#xff0c;对于国内设计师而言&#xff0c;由于语言上的障碍&#xff0c;使用这些软件可能会存在一定的困难。尤其是 Figma 虽然发展多年&#xff0c;但始终没有中文版&#xff0c;让众多设计…

手把手一起使用WPF开源UI框架MahApps.Metro

1、创建新项目 使用Visual Studio 2022创建新项目&#xff0c;如图点击创建新项目&#xff1a; 选择WPF应用(.NET Framework)&#xff1a; 配置新项目&#xff0c;如图&#xff1a; 随便写几个WPF默认样式控件&#xff1a; 2、安装 MahApps.Metro 点击工具->NuGet包管理器…

Iterator迭代器和Generator生成器

Iterator迭代器和for/of循环原理 Iterator迭代器规范 自己创建一个Iterator类,来实现ES6中的迭代器规范: class Iterator {constructor(assemble) {// assemble:需要迭代的数据结构this.assemble = assemble// index:记录迭代的次数(或者索引)this.index = -1}// 必须具…

excle中的条件求和SUMIF

问题&#xff1a;将每一行中红色文字的前一个值累计求和到境外总数这一列 使用的公式 自制单元格的格式计算公式&#xff1a;ctrlf3打开格式管理&#xff0c;创建如下公式&#xff0c;其中24是表示获取文字颜色 由于sumif只能直接与第二参数条件比较&#xff0c;所以先使用IF(公…

LoVT:医学图像与报告的局部表征联合学习

论文&#xff1a;https://arxiv.org/abs/2112.02889 Github&#xff1a;GitHub - philip-mueller/lovt: Localized representation learning from Vision and Text (LoVT) 摘要 摘要对比学习已被证明对未标记数据的预训练图像模型是有效的&#xff0c;在医学图像分类等任务中…

算法专题:子序列系列1

文章目录 单个序列问题示例1&#xff1a;最长递增子序列&#xff08;不连续&#xff09;思路DP数组含义递推公式初始化遍历顺序 完整版注意返回值问题 区分示例1&#xff1a;最长递增子数组区别&#xff1a;递推公式 示例2&#xff1a;最长连续递增序列&#xff08;连续&#x…

【LeetCode】不同路径Ⅱ

不同路径Ⅱ 题目描述算法流程编程代码 链接: 不同路径Ⅱ 题目描述 算法流程 编程代码 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& ob) {int m ob.size();int n ob[0].size();vector<vector<int>>dp(m1,vecto…

LabVIEW 开发在不确定路况下自动速度辅助系统

LabVIEW 开发在不确定路况下自动速度辅助系统 智能驾驶辅助系统是汽车行业最先进的升级和尖端技术&#xff0c;智能交通系统依靠智能驾驶辅助系统在公共交通部门工作。该智能驾驶辅助系统技术包括自适应巡航控制&#xff0c;防抱死制动系统&#xff0c;安全气囊展开&#xff0…

C# 中使用ValueTask优化异步方法

概要 我们在开发过程中&#xff0c;经常使用async的异步方法&#xff0c;但是有些时候&#xff0c;异步的方法中&#xff0c;可能包含一些同步的处理。本文主要介绍通过ValueTask这个struct&#xff0c;优化异步处理的方法性能。 代码及实现 有些时候我们会缓存一些数据在内…

【java线上监控】Arthas由菜鸟到菜鸡

目录 1 arthas介绍 1.1 简介 1.2 背景 1.3 Arthas&#xff08;阿尔萨斯&#xff09;能为你做什么&#xff1f; 2 window环境搭建 2.1 下载和启动 2.1 启动后&#xff1a;选择需要监控的服务 3 快速入门 3.1 打开浏览器 3.2 开启trace请求 3.3 查看 dashboard 3.6.…

UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号

版本 5.2.1 裁剪 - 剪切 - 剪切到边界 裁剪 - 高级 - 溢出策略 - 省略

消息触达平台 - 基础理论

目录 消息触达平台 背景 业务流程 触达配置 服务处理 表现展示 效果统计 触达信息结构 对象 内容 渠道 场景 机制 消息触达平台 背景 在产品生命周期的不同阶段&#xff0c;用户触达体系可以用来对不同用户群体进行定制化运营。结合咱们的日常场景&#xff0c;公司的运营同学或…

数据结构——单链表OJ题

单链表OJ题 前言一、删除链表中等于给定值 val 的所有节点二、反转一个单链表三、返回链表的中间结点四、输出该链表中倒数第k个结点五、将两个有序链表合并六、链表的回文结构七、将链表分割成两部分八、找出第一个公共结点九、判断链表中是否有环总结 前言 在前面的博客中我…

13-4_Qt 5.9 C++开发指南_基于QWaitCondition 的线程同步_Wait

在多线程的程序中&#xff0c;多个线程之间的同步实际上就是它们之间的协调问题。例如上一小节讲到的3个线程的例子中&#xff0c;假设 threadDAQ 写满一个缓冲区之后&#xff0c;threadShow 和 threadSaveFile 才能对缓冲区进行读操作。前面采用的互斥量和基于 OReadWriteLock…

【calc】需要使用新应用以打开此ms-calculator链接

问题出现 win10系统&#xff0c;winr输入calc调用计算器时候出现 需要使用新应用以打开此ms-calculator 链接 解决操作 左下角右键单击->Windows Powershell(管理员) # 先执行恢复商店 Get-AppXPackage *WindowsStore* -AllUsers | Foreach {Add-AppxPackage -Disable…

根据URL批量下载文件并压缩成zip文件

根据url批量下载图片或者视频&#xff0c;只需要将图片的url和名称放到数组对象即可&#xff0c;例如&#xff1a; let fileArr [{fvUrl:https://image.xuboren.com/image/2023/07/26/1410829074764cdbaa4314a084eb749e.jpg,fvName: 图片名称},{fvUrl:https://image.xuboren.…

雷柏VT350S反馈更敏捷,PC玩家不可或缺的游戏利器

FPS还有MOBA游戏是很多PC玩家的最爱道&#xff0c;一款好的鼠标可以让我们在游戏中更加得心应手&#xff0c;关键时刻甚至能逆转乾坤。以前&#xff0c;有线鼠标总是让人觉得不够自由&#xff0c;无线鼠标又担心延迟和续航。现在新款的无线鼠标终于能够做到超低延迟了&#xff…