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截取中文字符串的实现代码
Dec 22 Javascript
.NET微信公众号开发之创建自定义菜单
Jul 16 Javascript
Angularjs 滚动加载更多数据
Mar 17 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
Apr 28 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
Mar 20 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
详解JavaScript中关于this指向的4种情况
Apr 18 Javascript
socket在egg中的使用实例代码详解
May 30 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
Jul 06 Javascript
原生js添加一个或多个类名的方法分析
Jul 30 Javascript
VueJS实现用户管理系统
May 29 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自定义函数之递归删除文件及目录
2010/08/08 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
python实现简单温度转换的方法
2015/03/13 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
Python给图像添加噪声具体操作
2019/03/03 Python
python中下标和切片的使用方法解析
2019/08/27 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
心理健康心得体会
2014/01/02 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
总经理司机职责
2014/02/02 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
六一儿童节主持词
2014/03/21 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
长征观后感
2015/06/09 职场文书
实习感想范文
2015/08/10 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
浅谈克隆 JavaScript
2021/11/02 Javascript