在同一个canvas中绘制多个图形

实验背景:

在做一个 HTML 5 的一个游戏项目的时候,想在同一个 canvas 元素中绘制多个具有不同颜色的图画,但是由于当时对 HTML 5 canvas 元素不是很熟悉,结果总是所有图画都具有一样的颜色。去网上查找,也没有找到这个问题的答案,于是只能自己研究了。

 

实验说明:

该项目本是移动平台的跨平台项目,可以跑在WP7,WP8,Andriod,iOS,黑莓等平台,但由于 HTML 5 本身具有较好的跨平台性,所以在保证平台兼容性没有问题的

情况下,本次测试在PC上进行。

 

实验目的:

在同一个 canvas 元素中绘制多个不同颜色的图画

 

实验材料:

语言:HTML5,javascript

开发工具:VS 2012 

测试工具:IE 10

 

实验过程:

 

首先创建一个 HTML 5 的基本页面,并添加一个 canvas 元素,id 为 myCanvas,然后添加 JS 代码,绘制四个小圆圈

代码如下:

  1. <!DOCYTPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8" />  
  5.         <title>在同一个 canvas 元素中绘制不同颜色的图画</title>  
  6.         <script>  
  7.             function start()  
  8.             {  
  9.                 var c = document.getElementById("myCanvas")  
  10.                 var cxt = c.getContext("2d")  
  11.   
  12.                 cxt.fillStyle = "#FF00FF"  
  13.                 cxt.arc(100, 100, 50, 0, Math.PI * 2, true)  
  14.                 cxt.fill()   
  15.   
  16.                 cxt.fillStyle = "#FF0000"  
  17.                 cxt.arc(200, 200, 50, 0, Math.PI * 2, true)  
  18.                 cxt.fill()  
  19.   
  20.                 cxt.fillStyle = "#FFFF00"  
  21.                 cxt.arc(300, 300, 50, 0, Math.PI * 2, true)  
  22.                 cxt.fill()  
  23.   
  24.                 cxt.fillStyle = "#000000"  
  25.                 cxt.arc(400, 400, 50, 0, Math.PI * 2, true)  
  26.                 cxt.fill()  
  27.             }  
  28.         </script>  
  29.     </head>  
  30.     <body onload="start()">  
  31.         <canvas id="myCanvas" height="1000" width="1000">  
  32.             你的浏览器不支持 HTML 5  
  33.         </canvas>  
  34.     </body>  
  35. </html>  
<!DOCYTPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>在同一个 canvas 元素中绘制不同颜色的图画</title>
        <script>
            function start()
            {
                var c = document.getElementById("myCanvas")
                var cxt = c.getContext("2d")

                cxt.fillStyle = "#FF00FF"
                cxt.arc(100, 100, 50, 0, Math.PI * 2, true)
                cxt.fill() 

                cxt.fillStyle = "#FF0000"
                cxt.arc(200, 200, 50, 0, Math.PI * 2, true)
                cxt.fill()

                cxt.fillStyle = "#FFFF00"
                cxt.arc(300, 300, 50, 0, Math.PI * 2, true)
                cxt.fill()

                cxt.fillStyle = "#000000"
                cxt.arc(400, 400, 50, 0, Math.PI * 2, true)
                cxt.fill()
            }
        </script>
    </head>
    <body οnlοad="start()">
        <canvas id="myCanvas" height="1000" width="1000">
            你的浏览器不支持 HTML 5
        </canvas>
    </body>
</html>


 

效果如图:

 

代码说明:

本想为四个圆填充不同颜色,但最终结果是四个圆全部是黑色,即第四个圆的颜色,难道 一个 canvas 中只能有一种

fillStyle 吗?如果只有一种颜色,岂不是太单一?于是我又进行了多次测试。

经过测试,最终找到了一个解决方案。

canvas 绘制可以通过 JS 代码来控制(其实应该说 HTML 5  只是提供了个容器,绘制只能在 JS 里完成),而 JS 提

供了两个函数,beginPath() 和 closePath() ,这两

个函数可以起到类似 <div> 的作用,用它来把每个圆圈包围,就可以绘制不同颜色的图形了。

 

代码如下:

  1. <!DOCYTPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8" />  
  5.         <title>在同一个 canvas 元素中绘制不同颜色的图画</title>  
  6.         <script>  
  7.             function start()  
  8.             {  
  9.                 var c = document.getElementById("myCanvas")  
  10.                 var cxt = c.getContext("2d")  
  11.   
  12.                 cxt.beginPath() //注意此处  
  13.                 cxt.fillStyle = "#FF00FF"  
  14.                 cxt.arc(100, 100, 50, 0, Math.PI * 2, true)  
  15.                 cxt.fill()  
  16.                 cxt.closePath() //注意此处  
  17.   
  18.                 cxt.beginPath() //注意此处  
  19.                 cxt.fillStyle = "#FF0000"  
  20.                 cxt.arc(200, 200, 50, 0, Math.PI * 2, true)  
  21.                 cxt.fill()  
  22.                 cxt.closePath() //注意此处  
  23.   
  24.                 cxt.beginPath() //注意此处  
  25.                 cxt.fillStyle = "#FFFF00"  
  26.                 cxt.arc(300, 300, 50, 0, Math.PI * 2, true)  
  27.                 cxt.fill()  
  28.                 cxt.closePath() //注意此处  
  29.   
  30.                 cxt.beginPath() //注意此处  
  31.                 cxt.fillStyle = "#000000"  
  32.                 cxt.arc(400, 400, 50, 0, Math.PI * 2, true)  
  33.                 cxt.fill()  
  34.                 cxt.closePath() //注意此处  
  35.             }  
  36.         </script>  
  37.     </head>  
  38.     <body onload="start()">  
  39.         <canvas id="myCanvas" height="1000" width="1000">  
  40.             你的浏览器不支持 HTML 5  
  41.         </canvas>  
  42.     </body>  
  43. </html>  
<!DOCYTPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>在同一个 canvas 元素中绘制不同颜色的图画</title>
        <script>
            function start()
            {
                var c = document.getElementById("myCanvas")
                var cxt = c.getContext("2d")

                cxt.beginPath() //注意此处
                cxt.fillStyle = "#FF00FF"
                cxt.arc(100, 100, 50, 0, Math.PI * 2, true)
                cxt.fill()
                cxt.closePath() //注意此处

                cxt.beginPath() //注意此处
                cxt.fillStyle = "#FF0000"
                cxt.arc(200, 200, 50, 0, Math.PI * 2, true)
                cxt.fill()
                cxt.closePath() //注意此处

                cxt.beginPath() //注意此处
                cxt.fillStyle = "#FFFF00"
                cxt.arc(300, 300, 50, 0, Math.PI * 2, true)
                cxt.fill()
                cxt.closePath() //注意此处

                cxt.beginPath() //注意此处
                cxt.fillStyle = "#000000"
                cxt.arc(400, 400, 50, 0, Math.PI * 2, true)
                cxt.fill()
                cxt.closePath() //注意此处
            }
        </script>
    </head>
    <body οnlοad="start()">
        <canvas id="myCanvas" height="1000" width="1000">
            你的浏览器不支持 HTML 5
        </canvas>
    </body>
</html>


 

效果如图:

 

请读者们注意,两个函数有所属的对象,此事例中为 cxt 。

另外,在测试中,笔者还发现,当去掉所有的 closePath() 时,只保留 beginPath() ,一样可以达到目的,也就是

说,当遇到beginPath() 时,会自动重新开始下一个图形

的绘制(保留 closePath() ,去掉 beginPath() 时,效果相当于不添加这两个函数)。但是笔者个人认为,最好两个

函数都添加,这样会提高代码可读性,使代码更规

范。

 

实验结果:

成功在同一个 canvas 元素中绘制出不同颜色的多个图形,并且还对 beginPath() 和 closePath() 的用法有了意外收获。

 

实验总结:HMTL 5 的 canvas 是一大亮点,可以绘制出精美的图形(本文只是对某种用法的讨论,真正的 canvas

的功能要比此例强大的多),但对在实验中意外收获

的beginPath() 和closePath() 函数的用法,以及由此联想出的 canvas 绘制图形的机制,笔者还很不清楚,会在以后

找时间继续研究。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值