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


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 THICKBOX弹出层插件
Aug 30 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
Mar 12 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
Apr 08 Javascript
jQuery之排序组件的深入解析
Jun 19 Javascript
javascript类型转换示例
Apr 29 Javascript
JavaScript包装对象使用详解
Jul 09 Javascript
js获取地址栏中传递的参数(两种方法)
Feb 08 Javascript
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
vue实现百度下拉列表交互操作示例
Mar 12 Javascript
原生js实现无缝轮播图
Jan 11 Javascript
JavaScript严格模式不支持八进制的问题讲解
Nov 07 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
第九节 绑定 [9]
2006/10/09 PHP
自动生成文章摘要的代码[PHP 版本]
2007/03/20 PHP
帝国cms目录结构分享
2015/07/06 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
说说如何遍历Python列表的方法示例
2019/02/11 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
python实现按行分割文件
2019/07/22 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
浅析NumPy 切片和索引
2020/09/02 Python
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
详细的大学生创业计划书模板
2014/01/27 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
协议书格式模板
2016/03/24 职场文书
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android