canvas学习--事件操作

901 阅读1分钟

在canvas中,常见的事件共有三种,即鼠标事件、键盘事件和循环事件。有了这些事件,我们可以就可以创建交互性更强的动画。由于鼠标事件 - Web API 接口参考 | MDN (mozilla.org)键盘事件 KeyboardEvent() - Web API 接口参考 | MDN (mozilla.org)和循环事件(window.requestAnimationFrame - Web API 接口参考 | MDN (mozilla.org))。都可以在网上查到,这里就不一一叙述了,感兴趣的小伙伴们可以点击链接查看。

鼠标事件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <canvas id="canvas" width="300" height="300" style="border: 1px dashed gray;"></canvas>
</body>

<script>
    let width = 600;
    let height = 600;

    window.onload = function () {
        //写逻辑
        let canvas = document.getElementById('canvas');
        let cxt = canvas.getContext('2d');

        canvas.width = width;
        canvas.height = height;

        var x = width / 2;
        var y = height / 2;
        var r = 10;
        let colorArr = ['red','orange','yellow','green','teal','blue','purple'];

        createBall(x, y, r);

        window.addEventListener('mousedown', function (e) {
            cxt.clearRect(0, 0, canvas.width, canvas.height);

            let x = e.offsetX;
            let y = e.offsetY;

            createBall(x, y, r);
        },false);

        function createBall(x, y, r) {
            for(let i = 0;i < 7;i++){
                cxt.lineWidth = 10;
                cxt.beginPath();
                cxt.arc(x, y, r, 0, Math.PI * 2, true);
                cxt.closePath();

                cxt.strokeStyle = colorArr[i];
                cxt.stroke();

                r += 10;

                if(r == 70){
                    r == 10;
                }
            }
        }


    }


</script>

</html>

效果图如下:

mouse.gif

键盘事件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <canvas id="canvas" width="300" height="300" style="border: 1px dashed gray;"></canvas>
</body>

<script>
    let width = 600;
    let height = 600;

    window.onload = function () {
        //写逻辑
        let canvas = document.getElementById('canvas');
        let cxt = canvas.getContext('2d');

        canvas.width = width;
        canvas.height = height;

        var x = width / 2;
        var y = height / 2;
        var r = 30;

        createBall(x, y, r);

        var dir = getDirection();

        window.addEventListener('keydown', function () {
            //console.log(dir.direction);

            cxt.clearRect(0, 0, canvas.width, canvas.height);

            switch (dir.direction) {
                case 'up':
                    y -= 10;
                    createBall(x, y, r);
                    break;
                case 'down':
                    y += 10;
                    createBall(x, y, r);
                    break;
                case 'left':
                    x -= 10;
                    createBall(x, y, r);
                    break;
                case 'right':
                    x += 10;
                    createBall(x, y, r);
                    break;
                default :
                    createBall(x, y, r);
            }
        },false);


        function getDirection() {
            var key = {};

            window.addEventListener('keydown', function (e) {
                if (e.keyCode == 38 || e.keyCode == 87) {
                    key.direction = 'up';
                }
                else if (e.keyCode == 39 || e.keyCode == 68) {
                    key.direction = 'right';
                }
                else if (e.keyCode == 40 || e.keyCode == 83) {
                    key.direction = 'down';
                }
                else if (e.keyCode == 37 || e.keyCode == 65) {
                    key.direction = 'left';
                }
                else {
                    key.direction = '';
                }
            }, false);

            return key;
        }


        function createBall(x, y, r) {
            cxt.beginPath();
            cxt.arc(x, y, r, 0, Math.PI * 2, true);
            cxt.closePath();

            cxt.fillStyle = "orange";
            cxt.fill();
        }


    }


</script>

</html>

image.png

具体效果可粘贴代码自行体验。

循环事件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <canvas id="canvas" width="300" height="300" style="border: 1px dashed gray;"></canvas>
</body>

<script>
    let width = 600;
    let height = 600;
    window.onload = function () {
        //写逻辑
        let canvas = document.getElementById('canvas');
        let cxt = canvas.getContext('2d');

        canvas.width = width;
        canvas.height = height;
        
        var x = 30;
        var y = 30;
        var r = 30;

        (function frame(){
            window.requestAnimationFrame(frame);

            cxt.clearRect(0,0,width,height);

            cxt.beginPath();
            cxt.arc(x,y,r,0,Math.PI * 2,true);
            cxt.closePath();
            cxt.fillStyle = 'skyblue';
            cxt.fill();

            if(x >= r && x < width -r && y == r){
                x += 30;
            }

            if(x >= width - r && y >= r){
                y += 30;
            }

            if(y >= height - r && x >= r){
                x -= 30;
            }

            if(x <= r && y >= r){
                y -= 30;
            }

        })();



    }


</script>

</html>

效果图如下:

loop.gif