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 相关文章推荐
编辑浪子版表单验证类
May 12 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
Jan 23 Javascript
javascript 得到文件后缀名的思路及实现
May 09 Javascript
三种取消选中单选框radio的方法
Sep 09 Javascript
浅谈Javascript 数组与字典
Jan 29 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
Jun 07 Javascript
JS如何设置iOS中微信浏览器的title
Nov 22 Javascript
Node.js制作简单聊天室
Jan 12 Javascript
iscroll实现下拉刷新功能
Jul 18 Javascript
微信小程序wx.request实现后台数据交互功能分析
Nov 25 Javascript
vue input输入框关键字筛选检索列表数据展示
Oct 26 Javascript
layui添加动态菜单与选项卡
Jul 26 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获取中文拼音首字母类和函数分享
2014/04/24 PHP
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
Python探索之创建二叉树
2017/10/25 Python
详解Python字符串切片
2019/05/20 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
python设置表格边框的具体方法
2020/07/17 Python
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
消防战士优秀事迹材料
2014/02/13 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
班主任2015新年寄语
2014/12/08 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
市级三好学生评语
2014/12/29 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
高二化学教学反思
2016/02/22 职场文书
JS 基本概念详细介绍
2021/10/16 Javascript