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 相关文章推荐
使弱类型的语言JavaScript变强势
Jun 22 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
Dec 02 Javascript
用JQUERY增删元素的代码
Feb 14 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
Apr 02 Javascript
jQuery 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
js获取内联样式的方法
Jan 27 Javascript
jQuery插件Validate实现自定义校验结果样式
Jan 18 Javascript
常用jQuery选择器汇总
Feb 02 Javascript
AngularJs表单校验功能实例代码
Feb 09 Javascript
微信小程序页面开发注意事项整理
May 18 Javascript
微信小程序slider组件使用详解
Jan 31 Javascript
vue路由拦截器和请求拦截器知识点总结
Nov 08 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中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
jquery.ui.draggable中文文档
2009/11/24 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
jquery Banner轮播选项卡
2016/12/26 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
python中Flask框架简单入门实例
2015/03/21 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
Python colormap库的安装和使用详情
2020/10/06 Python
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
校长岗位职责
2013/11/26 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
活动总结范文
2014/08/30 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js