iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >canvas如何实现按住鼠标移动绘制出轨迹
  • 453
分享到

canvas如何实现按住鼠标移动绘制出轨迹

2023-06-09 14:06:00 453人浏览 泡泡鱼
摘要

小编给大家分享一下canvas如何实现按住鼠标移动绘制出轨迹,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概要工作以来,写过Vue、React、正则、算法、小程序

小编给大家分享一下canvas如何实现按住鼠标移动绘制出轨迹,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

概要

工作以来,写过VueReact、正则、算法小程序等知识,唯独没有写过canvas,因为实在不会啊!

2018年,给自己设定一个小目标:学会canvas,达到的效果是能用canvas实现一些css3不容易实现的动画。

本文作为学习canvas的第一篇收获,很多人初学canvas做的第一个demo是实现一个“钟”,当然,我也实现了一个,不过不讲这个,而是讲讲一个更有趣、也更简单的玩意。

鼠标按住绘制轨迹

需求

在一块canvas画布上,初始状态画布什么都没有,现在,我想给画布加一点鼠标事件,用鼠标在画布上写字。具体的效果是鼠标移动到画布上任意一点,然后按住鼠标,移动鼠标的位置,就可以开始写字啦!

canvas如何实现按住鼠标移动绘制出轨迹

原理

先简单分析下思路,首先我们需要一个canvas画布,然后计算鼠标在画布上的位置,给鼠标绑定onmousedown事件和onmousemove事件,在移动过程中绘制出路径,松开鼠标的时候,绘制结束。

这个思路虽然很简单,但是里面有些地方需要小技巧实现。

需要一个html文件,包含canvas元素。

这是一个宽度800,高度400的画布。为什么没有写px呢?哦,暂时没搞懂,canvas文档推荐的。

<!doctype html><html class="no-js" lang="zh">    <head>        <meta charset="utf-8">        <meta Http-equiv="x-ua-compatible" content="ie=edge">        <title>canvas学习</title>        <meta name="description" content="">        <meta name="viewport" content="width=device-width, initial-scale=1">        <link rel="manifest" href="site.WEBmanifest">        <link rel="apple-touch-icon" href="icon.png">        <link rel="stylesheet" href="CSS/main.css">    </head>    <body>        <canvas id="theCanvas" width="800" height="400"></canvas>        <script src="js/main.js"></script>    </body></html>

判断当前环境是否支持canvas。

在main.js中,我们写一个自执行函数,下面是兼容性判断的代码片段,“代码主体”中将会是实现需求的核心。

(function() {    let theCanvas = document.querySelector('#theCanvas')    if (!theCanvas || !theCanvas.getContext) {        //不兼容canvas        return false    } else {        //代码主体    }})()

获取2d对象。

let context = theCanvas.getContext('2d')

获取当前鼠标相对于canvas的坐标。

为什么要获取这个坐标呢?因为鼠标默认是获取当前窗口的相对坐标,而canvas可以位于页面上的任何位置,所以需要通过计算才能得到真实的鼠标坐标。

将获取鼠标相对于canvas的真实坐标封装成了一个函数,如果你觉得抽象,可以在草稿纸上画图来理解为什么要这么运算。

通常情况下,可以是x - rect.left和y - rect.top。但为什么实际上却是x - rect.left * (canvas.width/rect.width)呢?

canvas.width/rect.width表示判断canvas中存在的缩放行为,求出缩放的倍数。

const windowToCanvas = (canvas, x, y) => {    //获取canvas元素距离窗口的一些属性,MDN上有解释    let rect = canvas.getBoundinGClientRect()    //x和y参数分别传入的是鼠标距离窗口的坐标,然后减去canvas距离窗口左边和顶部的距离。    return {        x: x - rect.left * (canvas.width/rect.width),        y: y - rect.top * (canvas.height/rect.height)    }}

有了第4步的利器函数,我们可以给canvas加上鼠标事件了!

先给鼠标绑定按下onmousedown事件,用moveTo绘制坐标起点。

theCanvas.onmousedown = function(e) {    //获得鼠标按下的点相对canvas的坐标。    let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)    //es6的解构赋值    let { x, y } = ele    //绘制起点。    context.moveTo(x, y)}

移动鼠标的时候,没有鼠标长按事件,又该怎么监听呢?

这里用到的小技巧是在onmousedown内部再执行一个onmousemove(鼠标移动)事件,这样就能监听按住鼠标并且移动了。

theCanvas.onmousedown = function(e) {    //获得鼠标按下的点相对canvas的坐标。    let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)    //es6的解构赋值    let { x, y } = ele    //绘制起点。    context.moveTo(x, y)    //鼠标移动事件    theCanvas.onmousemove = (e) => {        //移动时获取新的坐标位置,用lineTo记录当前的坐标,然后stroke绘制上一个点到当前点的路径        let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)        let { x, y } = ele        context.lineTo(x, y)        context.stroke()    }}

鼠标松开的时候,不再绘制路径。

有什么办法可以让onmouseup事件中阻止掉上面监听的2种事件呢?方法挺多的,设置onmousedown和onmousemove为null算是一种,我这里用到了“开关”。isAllowDrawLine设置为bool值,来控制函数是否执行,具体代码可以看下面完整的源码

源码

分为3个文件,index.html、main.js、utils.js,这里用到了es6的语法,我是使用parcle配置好了开发环境,所以不会有报错,如果你直接,运行的时候出现错误,在无法升级浏览器的情况下,可以将es6语法改成es5.

index.html

上面已经展示了,不再复述。

main.js

import { windowToCanvas } from './utils'(function() {    let theCanvas = document.querySelector('#theCanvas')    if (!theCanvas || !theCanvas.getContext) {        return false    } else {        let context = theCanvas.getContext('2d')        let isAllowDrawLine = false        theCanvas.onmousedown = function(e) {            isAllowDrawLine = true            let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)            let { x, y } = ele            context.moveTo(x, y)            theCanvas.onmousemove = (e) => {                if (isAllowDrawLine) {                    let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)                    let { x, y } = ele                    context.lineTo(x, y)                    context.stroke()                }            }        }        theCanvas.onmouseup = function() {            isAllowDrawLine = false        }    }})()

utils.js

const windowToCanvas = (canvas, x, y) => {    let rect = canvas.getBoundingClientRect()    return {        x: x - rect.left * (canvas.width/rect.width),        y: y - rect.top * (canvas.height/rect.height)    }}export {    windowToCanvas}

以上是“canvas如何实现按住鼠标移动绘制出轨迹”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: canvas如何实现按住鼠标移动绘制出轨迹

本文链接: https://www.lsjlt.com/news/256436.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • canvas如何实现按住鼠标移动绘制出轨迹
    小编给大家分享一下canvas如何实现按住鼠标移动绘制出轨迹,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概要工作以来,写过vue、react、正则、算法、小程序...
    99+
    2023-06-09
  • win8系统如何关闭鼠标移动轨迹
    这篇文章主要介绍了win8系统如何关闭鼠标移动轨迹,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先打开控制面板,点击“硬件和声音”选项。在硬件和声音选项中找到并点击“鼠标”...
    99+
    2023-06-28
  • js+canvas实现可自动吸附闭合的鼠标绘制多边形
    本文实例为大家分享了js+canvas实现鼠标绘制多边形的具体代码,可自动吸附闭合,供大家参考,具体内容如下 效果图: 完整代码:(记得引入jQuery) <!DOCTYPE...
    99+
    2024-04-02
  • Qt如何实现实时鼠标绘制图形
    小编给大家分享一下Qt如何实现实时鼠标绘制图形,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!展示效果功能实现想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件:按下、移动、释放那么具体实现实时绘制矩形框的核心流程是什么呢?鼠...
    99+
    2023-06-29
  • canvas如何实现小球和鼠标的互动
    小编给大家分享一下canvas如何实现小球和鼠标的互动,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!<!DOCTYPE html><html ><head&g...
    99+
    2024-04-02
  • canvas中如何绘制贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
    小编给大家分享一下canvas中如何绘制贝塞尔公式推导与物体跟随复杂曲线的轨迹运动,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果预览在本例中生成的曲线由以上文...
    99+
    2023-06-09
  • jQuery如何实现div跟随鼠标移动
    小编给大家分享一下jQuery如何实现div跟随鼠标移动,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!重点是弄清楚如何获取鼠标现位置与移动后位置,div现在位置与移动后位置:用jQuery...
    99+
    2024-04-02
  • Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)
    目录1、利用IMU、GPS计算汽车移动距离和旋转角度2、画出kitti车的行驶轨迹3、画出所有车辆的轨迹本次内容主要是上周内容的延续,主要画出kitti车的行驶的轨迹 同样的,我们先...
    99+
    2024-04-02
  • js如何实现图片跟随鼠标移动
    这篇文章主要介绍“js如何实现图片跟随鼠标移动”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js如何实现图片跟随鼠标移动”文章能帮助大家解决问题。这里列举了两种实现...
    99+
    2024-04-02
  • Java如何实现鼠标随机移动效果
    这篇文章主要介绍“Java如何实现鼠标随机移动效果”,在日常操作中,相信很多人在Java如何实现鼠标随机移动效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java如何实现鼠标随机移动效果”的疑惑有所帮助!...
    99+
    2023-06-30
  • vue中如何实现鼠标移入添加class样式,鼠标移出去除样式
    这篇文章将为大家详细讲解有关vue中如何实现鼠标移入添加class样式,鼠标移出去除样式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。鼠标移入添加class样式HTMLH...
    99+
    2024-04-02
  • 纯CSS3如何实现鼠标滑过按钮动画
    这篇“纯CSS3如何实现鼠标滑过按钮动画”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“纯CSS3如何实现鼠标滑过按钮动画”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获...
    99+
    2023-06-08
  • 如何用css3实现鼠标悬停动画按钮
    这篇文章主要介绍“如何用css3实现鼠标悬停动画按钮”,在日常操作中,相信很多人在如何用css3实现鼠标悬停动画按钮问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用css...
    99+
    2024-04-02
  • 怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形
    这篇文章主要介绍“怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用js+canvas实现可自动吸附闭合的鼠标绘制多边形”文章能帮助大...
    99+
    2023-07-02
  • 如何使用CSS实现鼠标移上出现层的效果
    这篇文章主要介绍了如何使用CSS实现鼠标移上出现层的效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 CSS .demo ul{pos...
    99+
    2024-04-02
  • js如何实现鼠标左右移动图片也跟着移动的效果
    这篇文章将为大家详细讲解有关js如何实现鼠标左右移动图片也跟着移动的效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果:鼠标往左移,图片对应右移,鼠标往右移,图片就左...
    99+
    2024-04-02
  • 如何用PyQt5模拟实现网页鼠标移动特效
    这篇“如何用PyQt5模拟实现网页鼠标移动特效”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用PyQt5模拟实现网页鼠标...
    99+
    2023-06-29
  • 如何利用HTML+CSS实现跟踪鼠标移动功能
    这篇文章将为大家详细讲解有关如何利用HTML+CSS实现跟踪鼠标移动功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。随着用户越来越关注隐私并越来越注意防止在线跟踪,用户开始使用广告拦截器和脚本拦截器来阻...
    99+
    2023-06-08
  • 如何使用纯css3实现的鼠标悬停动画按钮
    小编给大家分享一下如何使用纯css3实现的鼠标悬停动画按钮,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!html代码:<div><span></span>...
    99+
    2024-04-02
  • C#如何实现图表中鼠标移动并显示数据
    这篇文章将为大家详细讲解有关C#如何实现图表中鼠标移动并显示数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下效果图:首先在页面上添加一个label控件并 默认隐藏:给该图表添加MouseMo...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作