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


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 相关文章推荐
js chrome浏览器判断代码
Mar 28 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
Jan 09 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
Oct 20 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
Feb 04 Javascript
动态加载JavaScript文件的两种方法
Apr 22 Javascript
浅谈js中的引用和复制(传值和传址)
Sep 18 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 Javascript
微信小程序页面滑动屏幕加载数据效果
Nov 16 Javascript
Vue 用Vant实现时间选择器的示例代码
Oct 25 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
Nov 20 Javascript
面试中canvas绘制图片模糊图片问题处理
Mar 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
用户的详细注册和判断
2006/10/09 PHP
PHP中$_SERVER的详细参数与说明
2008/07/29 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
Python跳出循环语句continue与break的区别
2014/08/25 Python
Python实现Const详解
2015/01/27 Python
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
django迁移文件migrations的实现
2020/03/31 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
如何使用Python调整图像大小
2020/09/26 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
销售员求职个人的自我评价
2014/02/19 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python