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


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 变量类型转换常用函数与代码[比较全]
Dec 01 Javascript
jQuery 三击事件实现代码
Sep 11 Javascript
JavaScript中的substr()方法使用详解
Jun 06 Javascript
javascript伸缩型菜单实现代码
Nov 16 Javascript
JavaScript引用类型和基本类型详解
Jan 06 Javascript
JS制作图形验证码实现代码
Oct 19 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
Vue.js组件高级特性实例详解
Dec 24 Javascript
node全局变量__dirname与__filename的区别
Jan 14 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
Jan 31 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
Mar 09 Javascript
js实现从右往左匀速显示图片(无缝轮播)
Jun 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
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
php ios推送(代码)
2013/07/01 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
解密效果
2006/06/23 Javascript
jQuery 入门讲解1
2009/04/15 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
JS获取时间的方法
2015/01/21 Javascript
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
Python求导数的方法
2015/05/09 Python
python搭建微信公众平台
2016/02/09 Python
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
python删除字符串中指定字符的方法
2018/08/13 Python
Python Cookie 读取和保存方法
2018/12/28 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
Farah官方网站:男士服装及配件
2019/11/01 全球购物
商铺租赁意向书
2014/04/01 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书