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


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 相关文章推荐
通过Javascript将数据导出到外部Excel文档的函数代码
Jun 15 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
Aug 29 Javascript
js取消单选按钮选中并判断对象是否为空
Nov 14 Javascript
用js格式化金额可设置保留的小数位数
May 09 Javascript
javascript常用函数归纳整理
Oct 31 Javascript
javascript框架设计读书笔记之种子模块
Dec 02 Javascript
jquery实现相册一下滑动两次的方法
Feb 09 Javascript
JavaScript中for循环的使用详解
Jun 03 Javascript
初步认识JavaScript函数库jQuery
Jun 18 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
Jun 17 Javascript
vue中关闭eslint的方法分析
Aug 04 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
Apr 10 Javascript
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
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
Python二分法搜索算法实例分析
2015/05/11 Python
深入学习Python中的装饰器使用
2016/06/20 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
django实现前后台交互实例
2017/08/07 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
Python实现Linux监控的方法
2019/05/16 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
医院搬迁方案
2014/06/14 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
angular异步验证器防抖实例详解
2022/03/31 Javascript
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技