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


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 相关文章推荐
jQuery之$(document).ready()使用介绍
Apr 05 Javascript
UpdatePanel和Jquery冲突的解决方法
Apr 01 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
jQuery操作cookie
Aug 08 Javascript
jQuery使用Layer弹出层插件闪退问题
Dec 22 Javascript
微信小程序选择图片和放大预览图片功能
Nov 02 Javascript
JS 中document.write()的用法和清空的原因浅析
Dec 04 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
Dec 15 Javascript
详解node.js中的npm和webpack配置方法
Jan 21 Javascript
vue中node_modules中第三方模块的修改使用详解
May 31 Javascript
node使用async_hooks模块进行请求追踪
Jan 28 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
浅析PHP的ASCII码转换类
2013/07/05 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
JavaScript基本对象
2007/01/11 Javascript
JavaScript 事件对象的实现
2009/07/13 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
Script的加载方法小结
2011/01/12 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
vue router下的html5 history在iis服务器上的设置方法
2017/10/18 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
python实现apahce网站日志分析示例
2014/04/02 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
python生成九宫格图片
2018/11/19 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
基于python操作ES实例详解
2019/11/16 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
详解python内置模块urllib
2020/09/09 Python
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
高中毕业生自我鉴定范文
2013/09/26 职场文书
护士求职信
2014/07/05 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
妇产科护理心得体会
2016/01/22 职场文书