• 总结html5-canvas学习笔记


    canvas是html5中很重要的一部分,我们可以用它来绘制各种平面图形, 3d图,动画等等。每每看到网上超炫的html5页面,首先立马下载下来,心里想着有一天自己也可以做出这样酷炫的效果,骚年你是不是这样的!

    比如这样的:

    还有这样的(这个是3d效果,点击图片进去看看吧):

    3d动态水池,进去看看

    但是,功夫不是一天练成的,一门新技术不是你学着做个demo就掌握了的,我们先要一点一点地学习基础知识才行呀。刚开始学html5的时候,我们都会先接触到canvas,api给的方法有很多,我是这样学的,自己写个demo,一个方法一个属性的去试,看它出来是个什么样子的。在这里我主要标记一下,我在练习过程中,遇到的一些疑惑。总结一下canvas.save()和canvas.restore(), canvas.beginPath()和canvas.closePath()怎么用。先把代码拉出来:

    canvas.save()和canvas.restore()用法:

    save() 和restore()主要在对画布进行转换(如:扭曲,旋转,缩放等)时很用作用。save()方法是保存画布当前状态的,restore()是取出画布 保存的状态。比如现在要对画布进行多个动作处理,第一个动作进行了缩放处理,如果在没有缩放处理前保存一下空白状态,那么再进行第二个动作新建时也会有第 一个动作缩放效果的影响。所以最好在对画布多个动作处理前,先canvas.save()保存一下空白状态或者你希望后面动作需要出现的状态,当前动作处 理完了再canvas.restore()一下,取出保存的空白状态保证后面的动作不受影响。

     /**图形变形**/
        var c10 = document.getElementById("myCanvas10");
        var cre10 = c10.getContext("2d");
        cre10.fillStyle = "#eeeeff";
        cre10.fillRect(0, 0, 300, 300);
        cre10.save();
        cre10.fillStyle = "rgba(255, 0, 0, 0.1)";
        cre10.translate(50, 50);
        cre10.scale(0.5, 0.5);
        cre10.rotate(Math.PI/4);
        cre10.fillRect(0, 0, 100, 100);
        cre10.restore();
        cre10.save();
        cre10.fillStyle = "rgba(255, 0, 0, 0.2)";
        cre10.rotate(Math.PI/4);
        cre10.translate(100, 100);
        cre10.scale(0.5, 0.5);
        cre10.fillRect(0, 0, 100, 100);
        cre10.restore();
        cre10.save();
        cre10.fillStyle = "rgba(255, 0, 0, 0.5)";
        cre10.translate(130, 130);
        cre10.scale(0.5, 0.5);
        cre10.shadowOffsetX = 10;
        cre10.shadowOffsetY = 10;
        cre10.shadowColor = "rgba(100, 100, 100, 0.5)";
        cre10.shadowBlur = 1.5;
        cre10.fillRect(0, 0, 150, 150);

    本来效果是这样的:

    如果去掉canvas.save()和canvas.restore()以后就是这样的:

    canvas.beginPath()和canvas.closePath()用法:

    这两个经常应用在绘制线条和圆弧中,可以成对用,也可以单独用,他们两个没有必然的联系。beginPath()是告诉浏览器我要开始划线了记录一下,这里作为一个起始点。closePath()是闭合路径,将结束焦点和起始点用直线链接起来。如果没有有closePath()结束的话,就不会有直线去链接结束点和起始点。

    两个一起用是这样的:

    没有用closePath()关闭线条:

    但是往往不用closePath()方法还可以达到很好的效果:

    下面是我用canvas画的小房子,很难看但是也要写出来:

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>绘制图形</title>
        <style type="text/css">
            .canv{
                border:1px #d3d3d3 solid;
                margin:20px 10px;
            }
        </style>
    </head>
    <body>
    <canvas class="canv" width="300" height="300" id="canvas01"></canvas>
    
    <script>
        window.onload = function(){
            drawHouse("canvas01");
        };
        //绿瓦红房子
        function drawHouse(id){
            var canv = document.getElementById(id);
            var canvas = canv.getContext("2d");
            canvas.fillStyle = "#eeeeff";
            canvas.fillRect(0, 0, 300, 300);
            console.info("第一步:空白,啥也没有");
            canvas.fillStyle = "green";
            canvas.beginPath();
            canvas.moveTo(150, 10);
            canvas.lineTo(270, 110);
            canvas.lineTo(30, 110);
            canvas.closePath();
            canvas.fill();
            canvas.fillStyle = "black";
            canvas.beginPath();
            canvas.moveTo(80, 68);
            canvas.lineTo(80, 20);
            canvas.lineTo(100, 20);
            canvas.lineTo(100, 52);
            canvas.closePath();
            canvas.fill();
            console.info("第二步:先盖绿色的房顶,黑色的烟囱");
            canvas.fillStyle = "red";
            canvas.beginPath();
            canvas.moveTo(50, 110);
            canvas.lineTo(50, 300);
            canvas.lineTo(250, 300);
            canvas.lineTo(250, 110);
            canvas.closePath();
            canvas.fill();
            console.info("第三步:刷红色的墙");
            canvas.fillStyle = "blue";
            canvas.beginPath();
            canvas.moveTo(80, 140);
            canvas.lineTo(80, 190);
            canvas.lineTo(130, 190);
            canvas.lineTo(130, 140);
            canvas.closePath();
            canvas.fill();
            canvas.strokeStyle = "white";
            canvas.beginPath();
            canvas.moveTo(105, 140);
            canvas.lineTo(105, 190);
            canvas.closePath();
            canvas.stroke();
            canvas.beginPath();
            canvas.moveTo(80, 165);
            canvas.lineTo(130, 165);
            canvas.closePath();
            canvas.stroke();
            console.info("第四步:开个蓝色窗户白色的格子");
            canvas.fillStyle = "white";
            canvas.beginPath();
            canvas.moveTo(150, 210);
            canvas.lineTo(150, 300);
            canvas.lineTo(210, 300);
            canvas.lineTo(210, 210);
            canvas.closePath();
            canvas.fill();
            canvas.fillStyle = "black";
            canvas.beginPath();
            canvas.arc(200, 255, 5, 0, Math.PI*2);
            canvas.closePath();
            canvas.fill();
            canvas.save();
            console.info("第五步:开一扇白色的门,黑把手");
        }
    
    </script>
    </body>
    </html>
  • 相关阅读:
    【水滴石穿】react-native-ble-demo
    【水滴石穿】mobx-todos
    【水滴石穿】ReactNativeMobxFrame
    【水滴石穿】react-native-aze
    如何扩展大规模Web网站的性能?
    10个有关RESTful API良好设计的最佳实践(转)
    VS2010+Oracle11+Entity Framework4.1环境搭建及常见问题(转)
    将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库
    oracle全托管驱动Oracle.ManagedDataAccess
    .net中使用ODP.net访问Oracle数据库(无客户端部署方法)
  • 原文地址:https://www.cnblogs.com/yetbobo/p/4819937.html
Copyright © 2020-2023  润新知