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


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 相关文章推荐
让元素在网页中可拖动示例代码
Aug 13 Javascript
jquery对元素拖动排序示例
Jan 16 Javascript
购物车选中得到价格实现示例
Jan 26 Javascript
node.js中的fs.chown方法使用说明
Dec 16 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
Mar 26 Javascript
全面解析Bootstrap表单样式的使用
Sep 09 Javascript
学好js,这些js函数概念一定要知道【推荐】
Jan 19 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
Feb 15 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
javascript的this关键字详解
May 20 Javascript
微信小程序实现点击图片放大预览
Oct 21 Javascript
JavaScript实现模态对话框实例
Jan 13 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
农民C键的运用技巧
2020/03/04 星际争霸
一些php技巧与注意事项分析
2011/02/03 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
php给图片加文字水印
2015/07/31 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
python下载图片实现方法(超简单)
2017/07/21 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
智能旅行箱:Horizn Studios
2018/04/30 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
机电一体化大学生求职信
2013/11/08 职场文书
高三语文教学反思
2014/01/15 职场文书
学校社会实践活动总结
2014/07/03 职场文书
装配出错检讨书
2014/09/23 职场文书
护士自荐信怎么写
2015/03/06 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android