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 相关文章推荐
JS 动态获取节点代码innerHTML分析 [IE,FF]
Nov 30 Javascript
javascript面向对象之对象的深入理解
Jan 13 Javascript
javascript实现框架高度随内容改变的方法
Jul 23 Javascript
jquery单击事件和双击事件冲突解决方案
Mar 02 Javascript
Javascript基础教程之比较null和undefined值
May 16 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 Javascript
jquery 手势密码插件
Mar 17 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
Aug 03 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
Element Alert警告的具体使用方法
Jul 27 Javascript
5种方法告诉你如何使JavaScript 代码库更干净
Sep 15 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
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
jQuery实现流动虚线框的方法
2015/01/29 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
Python深入学习之上下文管理器
2014/08/31 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
python实现石头剪刀布小游戏
2021/01/20 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
Ejb技术面试题
2015/04/29 面试题
学期自我鉴定范文
2013/10/01 职场文书
学习心得体会
2014/01/01 职场文书
安全协议书
2014/04/23 职场文书
环保小标语
2014/06/13 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
无犯罪记录证明
2014/09/19 职场文书
先进工作者个人总结
2015/02/15 职场文书
演讲开场白和结束语
2015/05/29 职场文书