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 相关文章推荐
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
Oct 12 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
Jan 23 Javascript
js清除input中type等于file的值域(示例代码)
Dec 24 Javascript
使用angular写一个hello world
Jan 23 Javascript
超全面的vue.js使用总结
Feb 12 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
Mar 14 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
Jun 30 Javascript
angular使用bootstrap方法手动启动的实例代码
Jul 18 Javascript
解决element ui select下拉框不回显数据问题的解决
Feb 20 Javascript
node.js基于socket.io快速实现一个实时通讯应用
Apr 23 Javascript
django中使用vue.js的要点总结
Jul 07 Javascript
Vue的列表之渲染,排序,过滤详解
Feb 24 Vue.js
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中的错误处理、异常处理机制分析
2012/05/07 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
php中JSON的使用与转换
2015/01/14 PHP
php时间计算相关问题小结
2016/05/09 PHP
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
Python用模块pytz来转换时区
2016/08/19 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
实习生个人找工作的自我评价
2013/10/30 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
创业计划书之养殖业
2019/10/11 职场文书
七个Python必备的GUI库
2021/04/27 Python