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


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查看html源文件
Nov 08 Javascript
javascript 字符串连接的性能问题(多浏览器)
Nov 18 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
Jan 14 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
Sep 26 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
Oct 17 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
Jun 22 Javascript
js中获取 table节点各tr及td的内容简单实例
Oct 14 Javascript
利用JQuery阻止事件冒泡
Dec 01 Javascript
浅述Javascript的外部对象
Dec 07 Javascript
js实现二级导航功能
Mar 03 Javascript
从零开始搭建一个react项目开发
Feb 09 Javascript
详解基于webpack&amp;gettext的前端多语言方案
Jan 29 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
session 的生命周期是多长
2006/10/09 PHP
用PHP读取IMAP邮件
2006/10/09 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
2014/06/13 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
JS 继承实例分析
2008/11/04 Javascript
DOM 基本方法
2009/07/18 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python编写一个闹钟功能
2017/07/11 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python jieba库用法及实例解析
2019/11/04 Python
用python进行视频剪辑
2020/11/02 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
班主任工作经验材料
2014/02/02 职场文书
致200米运动员广播稿
2014/02/06 职场文书
大型公益活动策划方案
2014/08/20 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python