当前位置: 首页 > 文档资料 > Canvas 实操教程 >

最后的API

优质
小牛编辑
127浏览
2023-12-01

橡皮擦clearRect()

之前一直教大家怎么绘图,各种画笔各种样式,却没有教过童鞋们使用橡皮擦。Canvas 提供了clearRect()方法,就是清空指定矩形上的画布上的像素。它接受四个参数,和其他绘制矩形的方法一样——context.clearRect(x,y,w,h)

下面,我们把之前新画布(实例 9-1)上的空白矩形给擦了吧!让整个页面显示出完整的背景图片。

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>clearRect()</title>
    <style>
        body { background: url("./images/bg2.jpg") repeat; }
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的浏览器居然不支持Canvas?!赶快换一个吧!!
    </canvas>
</div>

<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 600;
        var context = canvas.getContext("2d");
        context.fillStyle = "#FFF";
        context.fillRect(0,0,800,600);

        //清空画布
        context.clearRect(0,0,canvas.width,canvas.height);

    };
</script>
</body>
</html>

演示 22-1

运行结果:

清空画布

橡皮擦就是这么简单~

点泡泡小游戏

这里通过一个小游戏介绍一个交互性很强的API——isPointInPath()

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>点泡泡</title>
    <style>
        #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    </style>
</head>
<body>
<div id="canvas-warp">
    <canvas id="canvas">
        你的浏览器居然不支持Canvas?!赶快换一个吧!!
    </canvas>
</div>

<script>
    var balls = [];
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");

    window.onload = function(){
        canvas.width = 800;
        canvas.height = 600;

        for(var i=0; i<50; i++){
            var aBall = {
                x: Math.random() * canvas.width,
                y: Math.random() * canvas.height,
                r: Math.random() * 50 + 20
            };
            balls[i] = aBall;
        }

        draw();
        canvas.addEventListener("mousemove",detect);
    };

    function draw(){
        for(var i=0; i<balls.length; i++){
            context.beginPath();
            context.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI *2);
            context.globalAlpha = 0.5;

            var R = Math.floor(Math.random() * 255);
            var G = Math.floor(Math.random() * 255);
            var B = Math.floor(Math.random() * 255);

            context.fillStyle = "rgb(" + R + "," + G + "," + B + ")";
            context.fill();

        }
    }

    function detect(){
        var x = event.clientX - canvas.getBoundingClientRect().left;
        var y = event.clientY - canvas.getBoundingClientRect().top;

        for(var i=0; i<balls.length; i++){
            context.beginPath();
            context.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2);

            if(context.isPointInPath(x,y)){
                context.fillStyle = "rgba(255,255,255,0.1)";
                context.fill();
            }
        }
    }

</script>
</body>
</html>

演示 22-2

运行结果:

点泡泡小游戏

这个是基于示例 19-2小的交互游戏。鼠标移动到小球上,小球就会渐渐消失。这里用到了鼠标事件canvas.addEventListener("mousemove",function);以后会详细说。还用到了一个新的API——isPointInPath()。这个方法接收两个参数,就是一个点的坐标值,用来判断指定的点是否在当前路径中。若是,则返回true。

像素操作API

还有最后六个关于像素操作的API,基本不会用到,这里就不详细说了。列表如下。

属性描述
width返回 ImageData 对象的宽度
height返回 ImageData 对象的高度
data返回一个对象,其包含指定的 ImageData 对象的图像数据
方法描述
createImageData()创建新的、空白的 ImageData 对象
getImageData()返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据
putImageData()把图像数据(从指定的 ImageData 对象)放回画布上

如果童鞋们想深入学习,可以直接查HTML5 Canvas参考手册,自行了解学习。

Canvas 图形库

不知不觉写了22个章节,所有我们写的图形其实都可以封装在一个JS文件里,这个文件就是属于我们自己的图形库、图形引擎。当然,第三方也提供了很多优秀的图形库,这里推荐三个给大家。

  1. canvasplus
  2. Artisan JS
  3. Rgraph

大家有兴趣的话可以自行查阅了解一下。

Canvas API没有结束

Canvas的标准一直在更新,大家可以访问 W3C Canvas标准查看最新的API。但是一般最新的API很多浏览器都不会立刻去支持,所以可以等待大多数浏览器稳定支持了之后,我们再去掌握它也不迟。


至此,目前所有的Canvas API我们就已经讲完了。掌握了所有的绘画方法和技巧,成为一个艺术家,并不是我们最终的目标。或许,现在大家已然可以绘制出优美的图形,或抽象、或清新。或许,现在大家已经可以将Canvas API铭记于心,并且能够熟练使用它。

但是要知道,这只是基础。在之后的日子里,我们要基于Canvas 学习动画。众所周知,动画是由一帧帧的画面构成,不会绘画哪来动画?所以,Canvas绘制只是后面学习的基础。

这不是结束,而是一个新的开始。让我们继续前进~