Vue利用canvas实现移动端手写板的方法


Posted in Javascript onMay 03, 2018

本文介绍了Vue利用canvas实现移动端手写板的方法,分享给大家,具体如下:

<template>
 <div class="hello">
<!--touchstart,touchmove,touchend,touchcancel 这-->
 <button type="" v-on:click="clear">清除</button>
 <button v-on:click="save">保存</button>
  <canvas id="canvas" width="300" height="600" style="border:1px solid black">Canvas画板</canvas>
  <img v-bind:src="url" alt="">
 </div>
 
</template>

<script>
var draw;
var preHandler = function(e){e.preventDefault();}
class Draw {
  constructor(el) {
    this.el = el
    this.canvas = document.getElementById(this.el)
    this.cxt = this.canvas.getContext('2d')
    this.stage_info = canvas.getBoundingClientRect()
    this.path = {
      beginX: 0,
      beginY: 0,
      endX: 0,
      endY: 0
    }
  }
  init(btn) {
    var that = this; 
    
    this.canvas.addEventListener('touchstart', function(event) {
      document.addEventListener('touchstart', preHandler, false); 
      that.drawBegin(event)
    })
    this.canvas.addEventListener('touchend', function(event) { 
      document.addEventListener('touchend', preHandler, false); 
      that.drawEnd()
      
    })
    this.clear(btn)
  }
  drawBegin(e) {
    var that = this;
    window.getSelection() ? window.getSelection().removeAllRanges() : document.selection.empty()
    this.cxt.strokeStyle = "#000"
    this.cxt.beginPath()
    this.cxt.moveTo(
      e.changedTouches[0].clientX - this.stage_info.left,
      e.changedTouches[0].clientY - this.stage_info.top
    )
    this.path.beginX = e.changedTouches[0].clientX - this.stage_info.left
    this.path.beginY = e.changedTouches[0].clientY - this.stage_info.top
    canvas.addEventListener("touchmove",function(){
      that.drawing(event)
    })
  }
  drawing(e) {
    this.cxt.lineTo(
      e.changedTouches[0].clientX - this.stage_info.left,
      e.changedTouches[0].clientY - this.stage_info.top
    )
    this.path.endX = e.changedTouches[0].clientX - this.stage_info.left
    this.path.endY = e.changedTouches[0].clientY - this.stage_info.top
    this.cxt.stroke()
  }
  drawEnd() {
    document.removeEventListener('touchstart', preHandler, false); 
    document.removeEventListener('touchend', preHandler, false);
    document.removeEventListener('touchmove', preHandler, false);
    //canvas.ontouchmove = canvas.ontouchend = null
  }
  clear(btn) {
    this.cxt.clearRect(0, 0, 300, 600)
  }
  save(){
    return canvas.toDataURL("image/png")
  }
}

export default {
 data () {
  return {
   msg: 'Welcome to Your Vue.js App',
   val:true,
   url:""
  }
 },
 mounted() {
   draw=new Draw('canvas');
   draw.init();
 },
 methods:{
  clear:function(){
    draw.clear();
  },
  save:function(){
    var data=draw.save();
    this.url = data;
    console.log(data)
  },

 mutate(word) {
     this.$emit("input", word);
   },
} 
} 
</script> 
<!-- Add "scoped" attribute to limit CSS to this component only --> 
<style scoped>
h1, h2 {
 font-weight: normal;
}
ul {
 list-style-type: none;
 padding: 0;
}
li {
 display: inline-block;
 margin: 0 10px;
}
a {
 color: #42b983;
}
#canvas {
 background: pink;
 cursor: default;
}
#keyword-box {
 margin: 10px 0;
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
node.js中的buffer.fill方法使用说明
Dec 14 Javascript
简单实现异步编程promise模式
Jul 31 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
Sep 14 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
Jan 24 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
React Native之prop-types进行属性确认详解
Dec 19 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
May 18 Javascript
详解浏览器缓存和webpack缓存配置
Jul 06 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
Aug 24 Javascript
ES6 Iterator接口和for...of循环用法分析
Jul 31 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
Nov 26 Javascript
Node.Js中实现端口重用原理详解
May 03 #Javascript
原生JS实现的雪花飘落动画效果
May 03 #Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 #Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 #Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 #Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 #Javascript
Angular学习教程之RouterLink花式跳转
May 03 #Javascript
You might like
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
JavaScript效率调优经验
2009/06/04 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python ip正则式
2009/05/07 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
Python os模块学习笔记
2015/06/21 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
python实现扫雷游戏的示例
2020/10/20 Python
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
社区七一党员活动方案
2014/01/25 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
担保书范文
2015/01/20 职场文书
护士先进个人总结
2015/02/13 职场文书
2015党建工作简报
2015/07/21 职场文书
关于开学的感想
2015/08/10 职场文书