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


当前第2页 返回上一页

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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()

    }

}

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

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

源码

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

1、index.html

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

2、main.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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

        }

    }

})()

3、utils.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

/*

* 获取鼠标在canvas上的坐标

* */

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对象绑定事件 theCanvas.onmouseup,其实canvas不能绑定事件,真正绑定的是document和window。但是由于浏览器会自动帮你判断并且移交事件处理,所以完全不用担心。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

用HTML5 Canvas来绘制三角形和矩形等多边形的方法

以上就是如何利用canvas实现按住鼠标移动绘制出轨迹的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

实现弹幕效果的方法总结(css和canvas

html5实战-canvas绘制钟表的示例代码分享

canvas贝塞尔公式推导与物体跟随复杂曲线轨迹运动

关于canvas的一个实例教程--刮刮乐

h5在canvas中实现自定义路径动画

canvas绘制工作流之绘制节点

如何使用canvas画出平滑的曲线?(代码)

怎样用canvas来绘制彩色七巧板

canvas中普通动效与粒子动效的实现 方法介绍(代码示例)

h5 canvas api中drawimage(图像进行缩放或裁剪)的使用实例

更多相关阅读请进入《canvas》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...