Ch22 最后的API

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

    演示 22-1

    运行结果:

    橡皮擦就是这么简单~

    1. <!DOCTYPE html>
    2. <html lang="zh">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>点泡泡</title>
    6. <style>
    7. #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }
    8. </style>
    9. </head>
    10. <body>
    11. <div id="canvas-warp">
    12. <canvas id="canvas">
    13. 你的浏览器居然不支持Canvas?!赶快换一个吧!!
    14. </canvas>
    15. </div>
    16. <script>
    17. var balls = [];
    18. var canvas = document.getElementById("canvas");
    19. var context = canvas.getContext("2d");
    20. canvas.width = 800;
    21. canvas.height = 600;
    22. var aBall = {
    23. x: Math.random() * canvas.width,
    24. y: Math.random() * canvas.height,
    25. r: Math.random() * 50 + 20
    26. };
    27. balls[i] = aBall;
    28. }
    29. draw();
    30. canvas.addEventListener("mousemove",detect);
    31. };
    32. function draw(){
    33. for(var i=0; i<balls.length; i++){
    34. context.beginPath();
    35. context.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI *2);
    36. context.globalAlpha = 0.5;
    37. var R = Math.floor(Math.random() * 255);
    38. var G = Math.floor(Math.random() * 255);
    39. var B = Math.floor(Math.random() * 255);
    40. context.fill();
    41. }
    42. }
    43. function detect(){
    44. var y = event.clientY - canvas.getBoundingClientRect().top;
    45. for(var i=0; i<balls.length; i++){
    46. context.beginPath();
    47. context.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2);
    48. if(context.isPointInPath(x,y)){
    49. context.fillStyle = "rgba(255,255,255,0.1)";
    50. context.fill();
    51. }
    52. }
    53. }
    54. </script>
    55. </body>
    56. </html>

    运行结果:

    点泡泡小游戏

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

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

    方法 描述
    createImageData() 创建新的、空白的 ImageData 对象
    getImageData() 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据
    putImageData() 把图像数据(从指定的 对象)放回画布上

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

    1. Artisan JS

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

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


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

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