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代码
Sep 07 Javascript
用js判断用户浏览器是否是XP SP2的IE6
Mar 08 Javascript
JavaScript delete 属性的使用
Oct 08 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
Oct 17 Javascript
javascript抽象工厂模式详细说明
Dec 16 Javascript
浅谈JavaScript中的string拥有方法的原因
Aug 28 Javascript
servlet+jquery实现文件上传进度条示例代码
Jan 25 Javascript
Angularjs中使用指令绑定点击事件的方法
Mar 30 Javascript
jQuery菜单实例(全选,反选,取消)
Aug 28 jQuery
Vue组件通信中非父子组件传值知识点总结
Dec 05 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
Mar 25 Javascript
如何手写一个简易的 Vuex
Oct 10 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 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
怎么在Windows系统中搭建php环境
2013/08/31 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
php常用文件操作函数汇总
2014/11/22 PHP
php实现zip文件解压操作
2015/11/03 PHP
php基于curl重写file_get_contents函数实例
2016/11/08 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
vue实现中部导航栏布局功能
2019/07/30 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
python使用opencv读取图片的实例
2017/08/17 Python
深入理解Python3 内置函数大全
2017/11/23 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
模具专业推荐信
2013/10/30 职场文书
幼儿园义卖活动方案
2014/01/17 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
个人授权委托书格式
2014/08/30 职场文书
竞选纪律委员演讲稿
2014/09/13 职场文书
会计师事务所实习证明
2014/11/16 职场文书
中学教师个人总结
2015/02/10 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
详解Django中 render() 函数的使用方法
2021/04/22 Python
关于nginx 实现jira反向代理的问题
2021/09/25 Servers