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实现的网站首页随机公告随机公告
Mar 14 Javascript
JQuery CheckBox(复选框)操作方法汇总
Apr 15 Javascript
javascript中setAttribute()函数使用方法及兼容性
Jul 19 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
Aug 24 Javascript
简单谈谈javascript Date类型
Sep 06 Javascript
input点击后placeholder中的提示消息消失
Jan 15 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
将List对象列表转换成JSON格式的类实现方法
Jul 04 Javascript
JavaScript从原型到原型链深入理解
Jun 03 Javascript
Vue函数式组件的应用实例详解
Aug 30 Javascript
Node.js中文件系统fs模块的使用及常用接口
Mar 06 Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 07 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基础知识:控制结构
2006/12/13 PHP
PHP中的CMS的涵义
2007/03/11 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
python学习笔记:字典的使用示例详解
2014/06/13 Python
Php多进程实现代码
2018/05/07 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
Python super()函数使用及多重继承
2020/05/06 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
C#笔试题集合
2013/06/21 面试题
大学生涯自我鉴定
2014/01/16 职场文书
采购部部长岗位职责
2014/02/06 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
商超业务员岗位职责
2015/02/13 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书