HTML5权威指南笔记:35-使用canvas元素(1)

1 开始使用canvas 元素

canvas元素
元素类型短语/流
允许具有的父元素任何能包含短语或流元素的元素
局部属性height 、width
内容短语或流内容
标签用法开始和结束标签
是否为HTML5新增
在HTML5中的变化此处不适用
习惯样式

例子:

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: medium double black; margin: 4px}
        </style>
    </head>
    <body>
        <!--canvas元素里的内容会在浏览器不支持此元素时作为备用内容显示-->
        <canvas width="500" height="200">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
    </body>
</html>

2 获取画布的上下文

为了在canvas元素上绘图,我们需要获得一个上下文对象。

HTMLCanvasElement对象:

成员说明返回
height对应于height属性数值
width对应于width属性数值
getContext(<context>)为画布返回绘图上下文对象

例子:为画布获取二维上下文对象

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: medium double black; margin: 4px}
        </style>
    </head>
    <body>
        <canvas id="canvas" width="500" height="100">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <script>
            //传递2d表示获取二维上下文对象
            var ctx = document.getElementById("canvas").getContext("2d");
            //获取后就可以进行绘图
            ctx.fillRect(10, 10, 50, 50);
        </script>
    </body>
</html>

3 绘制矩形

简单的图形方法:

成员说明返回
clearRect(x, y, w, h)清除指定的矩形void
fillRect(x, y, w, h)绘制一个实心矩形void
strokeRect(x, y, w, h)绘制一个空心矩形void

x,y表示从canvas元素左上角算起的偏移量,w和h参数指定了待绘制矩形的宽度和高度。

例子:使用fillRect和strokeRect方法

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black; margin: 4px}
        </style>
    </head>
    <body>
        <canvas id="canvas" width="500" height="140">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <script>
            获取2d上下文对象
            var ctx = document.getElementById("canvas").getContext("2d");

            var offset = 10;
            var size = 50;
            var count = 5;

            for (var i = 0; i < count; i++) {
                //绘制实心矩形
                ctx.fillRect(i * (offset + size) + offset, offset, size, size);
                //绘制空心矩形
                ctx.strokeRect(i * (offset + size) + offset, (2 * offset) + size, 
                    size, size);
                //清空一部分矩形
                ctx.clearRect(i * (offset + size) + offset, offset + 5, size, size - 10);
            }
        </script>
    </body>
</html>

4 设置画布绘制状态

基本的绘制状态属性:

成员说明默认值
fillStyle获取或设置用于实心图形的样式black
lineJoin获取或设置线条与图形连接时的样式miter
lineWidth获取或设置线条的宽度1.0
strokeStyle获取或设置用于线条的样式black

4.1 设置线条连接样式

三个值:round 、bevel和miter , 默认值是miter 。
例子:

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black; margin: 4px}
        </style>
    </head>
    <body>
        <canvas id="canvas" width="500" height="140">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <script>
            var ctx = document.getElementById("canvas").getContext("2d");
            ctx.lineWidth = 20;

            ctx.lineJoin = "round";
            ctx.strokeRect(20, 20, 100, 100);

            ctx.lineJoin = "bevel";
            ctx.strokeRect(160, 20, 100, 100);

            ctx.lineJoin = "miter";
            ctx.strokeRect(300, 20, 100, 100);
        </script>
    </body>
</html>

4.2 设置填充和笔触样式

<canvas id="canvas" width="500" height="140">
    Your browser doesn't support the <code>canvas</code> element
</canvas>
<script>
    var ctx = document.getElementById("canvas").getContext("2d");
    //可以使用css颜色值来指定一种颜色,名称或颜色模型都可以。
    ctx.fillStyle = "black";
    ctx.strokeStyle = "rgb(0,0,0)";
</script>

4.3 使用渐变

渐变方法:

名称说明返回
createlinearGradient(xo, yo, x1, y1)创建线性渐变CanvasGradient
createRadialGradient(xo, yo, ro, x1, y1, rl)创建径向渐变CanvasGradient

CanvasGradient 的方法:
addColorStop(<position>, <color>):给渐变的梯度线添加一种纯色,返回void。

4.3.1 使用线性渐变
<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black; margin: 4px}
        </style>
    </head>
    <body>
        <canvas id="canvas" width="500" height="140">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <script>
            var ctx = document.getElementById("canvas").getContext("2d");
            //创建线性渐变,提供的四个值会作为画布上一条线段的开始和结束坐标
            var grad = ctx.createLinearGradient(0, 0, 500, 140);
            //添加线性渐变属性,0表示开始,1表示终点
            grad.addColorStop(0, "red");
            grad.addColorStop(0.5, "white");
            grad.addColorStop(1, "black");
            //定义渐变并添加颜色点之后,就可以用CanvasGradient对象来设置fillStyle或strokeStyle属性
            ctx.fillStyle = grad;
            //最后,就可以绘制一个图形
            ctx.fillRect(0, 0, 500, 140);            
        </script>
    </body>
</html>
4.3.2 使用径向渐变
<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black; margin: 4px}
        </style>
    </head>
    <body>
        <canvas id="canvas" width="500" height="140">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <script>
            var ctx = document.getElementById("canvas").getContext("2d");
            //创建径向渐变,渐变的起点由第一个圆定义,终点则是第二个圆,在两者之间添加颜色点。
            //起点圆的圆心坐标(第一个和第二个参数)
            //起点圆的半径(第三个参数)
            //终点圆的圆心坐标(第四个和第五个参数)
            //终点圆的半径(第六个参数)
            var grad = ctx.createRadialGradient(250, 70, 20, 200, 60, 100);
            //添加径向渐变属性,0表示开始,1表示终点
            grad.addColorStop(0, "red");
            grad.addColorStop(0.5, "white");
            grad.addColorStop(1, "black");
            //定义渐变并添加颜色点之后,就可以用CanvasGradient对象来设置fillStyle或strokeStyle属性
            ctx.fillStyle = grad;
            //最后,就可以绘制一个图形
            ctx.fillRect(0, 0, 500, 140);
        </script>
    </body>
</html>

4.5 使用图案

2D绘图上下文定义了对三种图案类型的支持:图像、视频和画布。但是只有图像得以实现。

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black; margin: 4px}
        </style>
    </head>
    <body>
        <canvas id="canvas" width="500" height="140">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <!--需要有一个img元素,它对用户是不可见的-->
        <img id="banana" hidden src="banana-small.png"/>
        <script>
            var ctx = document.getElementById("canvas").getContext("2d");
            //获取img元素
            var imageElem = document.getElementById("banana");
            //将获取的img元素作为创建图像的第一个参数。
            //第二个参数必须是repeat,repeat-x,repeat-y,no-repeat中的一个
            var pattern = ctx.createPattern(imageElem, "repeat");

            //最后就可以进行绘制了
            ctx.fillStyle = pattern;
            ctx.fillRect(0, 0, 500, 140);
        </script>
    </body>
</html>

5 保存和恢复绘制状态

使用下面的方法保存和恢复绘制状态

  1. save():保存绘制状态屈性的值,并把它们推入状态栈
  2. restore():取出状态栈的第一组值,用它们来设置绘制状态

例子:

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black; margin: 4px}
        </style>
    </head>
    <body>
        <canvas id="canvas" width="500" height="140" preload="auto">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <div>
            <button>Save</button>
            <button>Restore</button>
        </div>
        <script>
            var ctx = document.getElementById("canvas").getContext("2d");

            var grad = ctx.createLinearGradient(500, 0, 500, 140);
            grad.addColorStop(0, "red");
            grad.addColorStop(0.5, "white");
            grad.addColorStop(1, "black");

            var colors = ["black", grad, "red", "green", "yellow", "black", "grey"];

            var cIndex = 0;

            ctx.fillStyle = colors[cIndex];
            draw();

            var buttons = document.getElementsByTagName("button");
            for (var i = 0; i < buttons.length; i++) {
                buttons[i].onclick = handleButtonPress;
            }

            function handleButtonPress(e) {
                switch (e.target.innerHTML) {
                    //保存当前的绘制状态
                    case 'Save':
                        ctx.save();
                        cIndex = (cIndex + 1) % colors.length;
                        ctx.fillStyle = colors[cIndex];
                        draw();
                        break;
                    //恢复之前的绘制状态
                    case 'Restore':
                        cIndex = Math.max(0, cIndex -1);
                        ctx.restore();
                        draw();
                        break;
                }
            }
            function draw() {
                ctx.fillRect(0, 0, 500, 140);
            }
        </script>
    </body>
</html>

6 绘制图像

可以用drawlmage方法在画布上绘制图像

  1. 这个方法需要三个、五个或九个参数。
  2. 第一个参数始终是图像的来源,它可以是代表img 、video或其他canvas元素的DOM对象。
  3. 使用三个参数时,第二个和第三个参数给出了图像应当在画布上绘制的坐标。
  4. 使用五个参数时,额外的参数指定了应当给图像绘制的宽度和高度,以代替原始尺寸。
  5. 使用九个参数时:第二个和第三个参数是在源图像内的偏移量;第四个和第五个参数是源图像所需使用区域的宽度和高度;第六个和第七个参数指定了所选区域的左上角将要在画布上绘制的坐标;第八个和第九个参数指定了所选区域将要绘制的宽度和高度。

例子:对视频进行截图

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black}
            body > * {float:left;}
        </style>
    </head>
    <body>
        <video id="vid" src="timessquare.webm" controls preload="auto" 
            width="360" height="240">
            Video cannot be displayed
        </video>
        <div>
            <button id="pressme">Snapshot</button>
        </div>        
        <canvas id="canvas" width="360" height="240">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <script>
            var ctx = document.getElementById("canvas").getContext("2d");
            var imageElement = document.getElementById("vid");
            //获取视频video对象后,点击按钮会对当前侦进行截图,并绘制在canvas中
            document.getElementById("pressme").onclick = function(e) {
                 ctx.drawImage(imageElement, 0, 0, 360, 240);
            }
        </script>
    </body>
</html>

例子:用canvas显示视频并在上面绘图

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black}
            body > * {float:left;}
        </style>
    </head>
    <body>
        <!--隐藏视频-->
        <video id="vid" hidden src="timessquare.webm" preload="auto" 
            width="360" height="240" autoplay></video>
        <canvas id="canvas" width="360" height="240">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <script>
            var ctx = document.getElementById("canvas").getContext("2d");
            var imageElement = document.getElementById("vid");

            var width = 100;
            var height = 10;
            ctx.lineWidth = 5;
            ctx.strokeStyle = "red";

            //添加计时器,对图像进行截图,并使用canvas进行绘制
            setInterval(function() {
                ctx.drawImage(imageElement, 0, 0, 360, 240);
                ctx.strokeRect(180 - (width/2),120 - (height/2), width, height);
            }, 25);
            //添加计时器,改变绘制图像的属性
            setInterval(function() {
                width = (width + 1) % 200;
                height = (height + 3) % 200;
            }, 100);

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

例子:将画布作为drawImage方法的来源

<!DOCTYPE HTML>
<html>
    <head>
        <title>Example</title>
        <style>
            canvas {border: thin solid black}
            body > * {float:left;}
        </style>
    </head>
    <body>
        <video id="vid" hidden src="timessquare.webm" preload="auto" 
            width="360" height="240" autoplay></video>
        <canvas id="canvas" width="360" height="240">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <div>
            <button id="pressme">Press Me</button>
        </div>
        <canvas id="canvas2" width="360" height="240">
            Your browser doesn't support the <code>canvas</code> element
        </canvas>
        <script>
            var srcCanvasElement = document.getElementById("canvas");
            var ctx = srcCanvasElement.getContext("2d");
            var ctx2= document.getElementById("canvas2").getContext("2d");
            var imageElement = document.getElementById("vid");

            document.getElementById("pressme").onclick = takeSnapshot;

            var width = 100;
            var height = 10;
            ctx.lineWidth = 5;
            ctx.strokeStyle = "red";
            ctx2.lineWidth = 30;
            ctx2.strokeStyle = "black;"

            setInterval(function() {
                ctx.drawImage(imageElement, 0, 0, 360, 240);
                ctx.strokeRect(180 - (width/2),120 - (height/2), width, height);
            }, 25);

            setInterval(function() {
                width = (width + 1) % 200;
                height = (height + 3) % 200;
            }, 100);

            //当按钮被按下时,我把代表原canvas的HTMLCanvasElement对象作为第一个参数,
            //用于调用第二个canvas上下文对象上的drawlmage方法
            function takeSnapshot() {
                ctx2.drawImage(srcCanvasElement, 0, 0, 360, 240);
                ctx2.strokeRect(0, 0, 360, 240);
            }
        </script>
    </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值