通过JavaScript记录鼠标运动轨迹并利用canvas进行轨迹重现_js中canvas轨迹同步-程序员宅基地

技术标签: 前端杂事  

一周前所长找到我,问我有没有办法记录鼠标轨迹~~

详细的问过他的具体需求之后,发现是要做成这样的,以下为效果图:
在这里插入图片描述

思考

  1. 如何记录鼠标轨迹
    记录鼠标轨迹的方法很简单,记录鼠标每次move事件的前后两个点坐标即可。
  2. 如何重绘
    我们通过记录鼠标在canvas中的点的相对坐标可以得到一个对象数组,通过requestAnimationFrame递归对数组进行循环操作,相关代码如下:
    redraw (context) {
    
      if (localStorage.getItem('history')) {
    
        let history = JSON.parse(localStorage.getItem('history'))
        const len = history.length
        let i = 0
        const runner = () => {
    
          if (i < len) {
    
            this.draw(context, history[i][0], history[i++][1]) //绘制两点之间的连线
            requestAnimationFrame(runner) //递归调用
          }
        }
        requestAnimationFrame(runner)
      }
    }

组件源码

<template>
  <section>
    <button @click="reload">开始重绘</button>
    <button @click="reset">重置右侧画板</button>
    <h1>测试画板</h1>
    <canvas id="panel1" width="700px" height="500" style="border: 1px solid ;">

    </canvas>
    <canvas id="panel2" width="700px" height="500" style="border: 1px solid ;">

    </canvas>
  </section>
</template>

<script>
export default {
    
  name: 'redraw',
  mounted () {
    
    this.canvas = document.querySelector('#panel1')
    this.redrawCanvas = document.querySelector('#panel2')
    this.init()
  },
  methods: {
    
    reload () {
    
      this.reset()
      this.redraw(this.redrawCxt)
    },
    init () {
    
      this.canvas.onmousedown = e => {
    
        this.isMouseDown = true
        this.lastLoc = this.window2Canvas(e.clientX, e.clientY)
      }
      this.canvas.onmouseout = e => {
    
        this.isMouseDown = false
      }
      this.canvas.onmousemove = e => {
    
        if (this.isMouseDown) {
    
          let curLoc = this.window2Canvas(e.clientX, e.clientY)// 获得当前坐标
          this.draw(this.context, this.lastLoc, curLoc)
          this.history.push([this.lastLoc, curLoc])
          this.lastLoc = Object.assign({
    }, curLoc) // U know what I mean.
        }
      }
      this.canvas.onmouseup = e => {
    
        this.isMouseDown = false
        if (history.length) {
    
          localStorage.setItem('history', JSON.stringify(this.history))
        }
      }
    },
    window2Canvas (x, y) {
    
      let bbox = this.canvas.getBoundingClientRect()
      return {
    x: Math.round(x - bbox.left), y: Math.round(y - bbox.top)}
    },
    draw (context, lastLoc, curLoc) {
    
      context.lineWidth = 5
      context.beginPath()
      context.moveTo(lastLoc.x, lastLoc.y)
      context.lineTo(curLoc.x, curLoc.y)
      context.strokeStyle = '#000'
      context.lineCap = 'round'
      context.lineJoin = 'round'
      context.stroke()
    },
    reset () {
    
      this.redrawCxt.clearRect(0, 0, this.redrawCanvas.width, this.redrawCanvas.height)
    },
    redraw (context) {
    
      if (localStorage.getItem('history')) {
    
        let history = JSON.parse(localStorage.getItem('history'))
        const len = history.length
        let i = 0
        const runner = () => {
    
          i++
          if (i < len) {
    
            this.draw(context, history[i][0], history[i][1])
            requestAnimationFrame(runner)
          }
        }
        requestAnimationFrame(runner)
      }
    }
  },
  data () {
    
    return {
    
      canvas: null,
      redrawCanvas: null,
      isMouseDown: false,
      lastLoc: {
    x: 0, y: 0},
      history: []
    }
  },
  computed: {
    
    context () {
    
      return this.canvas.getContext('2d')
    },
    redrawCxt () {
    
      return this.redrawCanvas.getContext('2d')
    }
  }
}
</script>

<style scoped>

</style>

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/csu_passer/article/details/97041856

智能推荐

python-字符串中使用%%有什么作用?%操作符的各种用法小结_python %%-程序员宅基地

文章浏览阅读1.3w次,点赞6次,收藏43次。python-字符串中使用%%有什么作用?%操作符的各种用法小结_python %%

统计平均分:从文本读取成绩并计算平均分,将平均分写入文本文件保存_包含学生考试成绩的源文本文件中提取并计算平均分-程序员宅基地

文章浏览阅读1.2k次。从文本读取成绩并计算平均分,将平均分写入文本文件保存。【学习的细节是欢悦的历程】Python官网Free:大咖免费“圣经”教程python 完全自学教程,不仅仅是基础那么简单……自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。——华罗庚HOT好文力荐从文本读取成绩并计算平均分统计平均分(将平均分写入文本文件保存)本文质量分:90目 录。_包含学生考试成绩的源文本文件中提取并计算平均分

[Intensive Reading]MOT:FairMOT_fairmot实现mot评估-程序员宅基地

文章浏览阅读2.1k次,点赞5次,收藏10次。简介《FairMOT:A Simple Baseline for Multi-Object Tracking》是一个online的多目标跟踪(MOT)算法,基于TBD(Traking-by-Detection)的策略,FairMOT主要就是基于JDE做的改进,可以简单的理解为,FairMOT是将JDE的YOLOv3的主干,改成了CenterNet,也就是将检测的方法由Anchor-base换成了Anchor-free,然后同样在已有检测模型上加了了embeeding分支,模型输出检测的结果和embeedi_fairmot实现mot评估

VS 2008 显示代码行数/改变程序格式风格_vs2008显示行数-程序员宅基地

文章浏览阅读3.9k次。VS 2008 显示代码行数:开发环境C#,其他类同操作。工具-》选项-》文本编辑器-》C#里的显示“行号”勾上即可。-------------------------------------------------------------------------------------------------------改变VS程序风格:java风格: private v_vs2008显示行数

Web前端设计全方位解析:面试题总结+答案详解_前端实现填空题-程序员宅基地

文章浏览阅读1.5k次,点赞21次,收藏29次。面试习题大总结,进来免费白嫖啦_前端实现填空题

0043期基于python的CNN训练识别吃的-含数据集-程序员宅基地

文章浏览阅读681次,点赞19次,收藏14次。083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型。117nlp自然语言处理-文本情感分类-joy-sadness-anger-fear-love-surprise。运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地。

随便推点

在VUE中使用swiper,swiper全屏滑动_vue swiper组件上下滑动全屏-程序员宅基地

文章浏览阅读5.6k次。1,安装npm install --s vue-awesome-swiper2,在main.js中使用import vueAwesomeSwiper from 'vue-awesome-swiper'Vue.use(vueAwesomeSwiper);3,在页面使用<template> <div class="home"> <s..._vue swiper组件上下滑动全屏

百度ueditor富文本编辑器支持从word复制粘贴保留格式和图片的插件_ueditor怎么设置只保留编辑文字的功能插件-程序员宅基地

文章浏览阅读266次。tinymce是很优秀的一款富文本编辑器,可以去官网下载。https://www.tiny.cloud这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用。umeditor+粘贴word图片 – 泽优软件博客以vue为例说明:将tinymce下载后放到static目录下,不用npm安装。powerpaste放到\static\tinymce\plugins目录下在index.html中引入tinymce.min.js。代码参数配置如_ueditor怎么设置只保留编辑文字的功能插件

linux catalina.sh java_opts,Tomcat启动脚本catalina.sh---解读-程序员宅基地

文章浏览阅读1k次。原网址:http://blog.csdn.net/sun8288/article/details/78431271 - 概述脚本catalina.sh用于启动和关闭tomcat服务器,是最关键的脚本另外的脚本startup.sh和shutdown.sh都是使用不同的参数调用了该脚本该脚本的使用方法如下(引自该脚本本身):echo "Usage: catalina.sh ( commands ......_catalina.sh java_opts

【算法题】一种字符串压缩表示的解压(js)-程序员宅基地

文章浏览阅读100次。全部由小写英文字母组成,压缩后不会出现@,故输出不合法。两个d不需要压缩,故输入不合法。_一种字符串压缩表示的解压

matplotlib将figure转化为numpy的array矩阵格式_manager.canvas.figure转换成array-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏10次。最近碰到一个问题,python读入视频,并处理每一张图片,并将处理的结果用quiver显示为矢量图,然后将矢量图转化为numpy数据。在这整个过程中碰到以下问题:1)怎么使用quiver,这个用起来有很多参数需要设置,没有MATLAB用起来方便,不过这个不是本博文的重点。2)怎么将矢量图的效果转化为numpy数据,这个我在百度上搜索了好多博文,但是都不是我想要的效果,当我科学上网时,发现matplotlib有官方的介绍,这里贴出链接3)成功的转化为numpy后,又发现我的数据又多了轴参数,致使整个_manager.canvas.figure转换成array

机器学习与数据挖掘-实验二_《机器学习与数据挖掘》实验二-程序员宅基地

文章浏览阅读1.1k次。1. 根据给定数据集(存放在data1.txt文件中,二分类数据),编码实现基于梯度下降的Logistic回归算法,画出决策边界;2. 从UCI中选择鸢尾花数据集(多分类数据),使用Sklearn实现Logistic回归;实现第一个决策边界的代码如下:(注意格式)import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn import linear_modelfrom sklearn._《机器学习与数据挖掘》实验二

推荐文章

热门文章

相关标签