微信小程序实现的涂鸦功能示例【附源码下载】


Posted in Javascript onJanuary 12, 2018

本文实例讲述了微信小程序实现的涂鸦功能。分享给大家供大家参考,具体如下:

先来看看运行效果:

微信小程序实现的涂鸦功能示例【附源码下载】

布局文件index.wxml:

<view class="container">
  <!--画布区域-->
  <view class="canvas_area">
    <!--注意:同一页面中的 canvas-id 不可重复,如果使用一个已经出现过的 canvas-id,该 canvas 标签对应的画布将被隐藏并不再正常工作-->
    <canvas canvas-id="myCanvas" class="myCanvas"
      disable-scroll="false"
      bindtouchstart="touchStart"
      bindtouchmove="touchMove"
      bindtouchend="touchEnd">
    </canvas>
  </view>
  <!--画布工具区域-->
  <view class="canvas_tools">
    <view class="box box1" bindtap="penSelect" data-param="5"></view>
    <view class="box box2" bindtap="penSelect" data-param="15"></view>
    <view class="box box3" bindtap="colorSelect" data-param="#cc0033"></view>
    <view class="box box4" bindtap="colorSelect" data-param="#ff9900"></view>
    <view class="box box5" bindtap="clearCanvas"></view>
  </view>
</view>

逻辑功能文件index.js:

Page({
 data:{
  pen : 3, //画笔粗细默认值
  color : '#cc0033' //画笔颜色默认值
 },
 startX: 0, //保存X坐标轴变量
 startY: 0, //保存X坐标轴变量
 isClear : false, //是否启用橡皮擦标记
 //手指触摸动作开始
 touchStart: function (e) {
   //得到触摸点的坐标
   this.startX = e.changedTouches[0].x
   this.startY = e.changedTouches[0].y
   this.context = wx.createContext()
   if(this.isClear){ //判断是否启用的橡皮擦功能 ture表示清除 false表示画画
     this.context.setStrokeStyle('#F8F8F8') //设置线条样式 此处设置为画布的背景颜色 橡皮擦原理就是:利用擦过的地方被填充为画布的背景颜色一致 从而达到橡皮擦的效果 
     this.context.setLineCap('round') //设置线条端点的样式
     this.context.setLineJoin('round') //设置两线相交处的样式
     this.context.setLineWidth(20) //设置线条宽度
     this.context.save(); //保存当前坐标轴的缩放、旋转、平移信息
     this.context.beginPath() //开始一个路径 
     this.context.arc(this.startX,this.startY,5,0,2*Math.PI,true); //添加一个弧形路径到当前路径,顺时针绘制 这里总共画了360度 也就是一个圆形 
     this.context.fill(); //对当前路径进行填充
     this.context.restore(); //恢复之前保存过的坐标轴的缩放、旋转、平移信息
   }else{
     this.context.setStrokeStyle(this.data.color)
     this.context.setLineWidth(this.data.pen)
     this.context.setLineCap('round') // 让线条圆润 
     this.context.beginPath()
   }
 },
 //手指触摸后移动
 touchMove: function (e) {
   var startX1 = e.changedTouches[0].x
   var startY1 = e.changedTouches[0].y
   if(this.isClear){ //判断是否启用的橡皮擦功能 ture表示清除 false表示画画
    this.context.save(); //保存当前坐标轴的缩放、旋转、平移信息
    this.context.moveTo(this.startX,this.startY); //把路径移动到画布中的指定点,但不创建线条
    this.context.lineTo(startX1,startY1); //添加一个新点,然后在画布中创建从该点到最后指定点的线条
    this.context.stroke(); //对当前路径进行描边
    this.context.restore() //恢复之前保存过的坐标轴的缩放、旋转、平移信息
    this.startX = startX1;
    this.startY = startY1;
   }else{
    this.context.moveTo(this.startX, this.startY)
    this.context.lineTo(startX1, startY1)
    this.context.stroke()
    this.startX = startX1;
    this.startY = startY1;
   }
   //只是一个记录方法调用的容器,用于生成记录绘制行为的actions数组。context跟<canvas/>不存在对应关系,一个context生成画布的绘制动作数组可以应用于多个<canvas/>
   wx.drawCanvas({
     canvasId: 'myCanvas',
     reserve: true,
     actions: this.context.getActions() // 获取绘图动作数组
   })
 },
 //手指触摸动作结束
 touchEnd: function () {
 },
 //启动橡皮擦方法
 clearCanvas: function(){
   if(this.isClear){
    this.isClear = false;
   }else{
    this.isClear = true;
   }
 },
 penSelect: function(e){ //更改画笔大小的方法
  console.log(e.currentTarget);
  this.setData({pen:parseInt(e.currentTarget.dataset.param)});
  this.isClear = false;
 },
 colorSelect: function(e){ //更改画笔颜色的方法
  console.log(e.currentTarget);
  this.setData({color:e.currentTarget.dataset.param});
  this.isClear = false;
 }
})

附:完整实例代码点击此处本站下载

希望本文所述对大家微信小程序开发有所帮助。

Javascript 相关文章推荐
OfflineSave离线保存代码再次发布使用说明
May 23 Javascript
Javascript 跨域访问解决方案
Feb 14 Javascript
setTimeout()与setInterval()方法区别介绍
Dec 24 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
Jan 09 Javascript
轻量级的原生js日历插件calendar.js使用指南
Apr 28 Javascript
最简单的tab切换实例代码
May 13 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
May 18 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
Jun 21 Javascript
JS动态加载脚本并执行回调操作
Aug 24 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
Oct 16 Javascript
vue如何实现自定义底部菜单栏
Jul 01 Javascript
vue中data里面的数据相互使用方式
Jun 05 Vue.js
js 索引下标之li集合绑定点击事件
Jan 12 #Javascript
简单的Vue SSR的示例代码
Jan 12 #Javascript
详解如何在react中搭建d3力导向图
Jan 12 #Javascript
关于axios不能使用Vue.use()浅析
Jan 12 #Javascript
Vuex 进阶之模块化组织详解
Jan 12 #Javascript
动态Axios的配置步骤详解
Jan 12 #Javascript
JS兼容所有浏览器的DOMContentLoaded事件
Jan 12 #Javascript
You might like
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
2018/09/19 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
python基于socket实现网络广播的方法
2015/04/29 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
java字符串格式化输出实例讲解
2021/01/06 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
法制宣传月活动总结
2014/04/29 职场文书
新员工考核评语
2014/12/31 职场文书
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL
TS 类型收窄教程示例详解
2022/09/23 Javascript