守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1410|回复: 0
打印 上一主题 下一主题

[技术资料] html5 CanvasPattern对象用法详解

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52693
    钢镚
    1422

    开源英雄守望者

    跳转到指定楼层
    楼主
    发表于 2016-7-22 18:28:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    注意:本文属于《html5 Canvas绘制图形入门详解》系列文章中的一部分。如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解Canvas,甚至无法顺畅地通读本文。请点击上述链接以了解使用HTML5 Canvas绘制图形的完整内容。

    CanvasPattern对象是HTML5 Canvas API中用于给指定的图形铺上指定的图像的关键对象,这与CSS中background属性的作用有点类似。CanvasPattern 对象就表示平铺图像所采用的模式(在指定的图形上以何种方式进行平铺)。

    CanvasPattern对象的用法非常简单。我们只需要使用CanvasRenderingContext2D对象的 createPattern() 方法创建一个新的 CanvasPattern 对象,并将该对象设为CanvasRenderingContext2D对象的strokeStylefillStyle属性值即可。

    下面,我们就来详细了解一下CanvasRenderingContext2D对象的createPattern()方法。

    createPattern(image, repetitionStyle)

    createPattern()方法用于创建一个表示将图像在当前图形上以什么样的方式进行重复平铺的CanvasPattern对象。参数image指定用于平铺的图像,该参数可以是一个Image对象,也可以是一个Canvas对象。参数repetitionStyle表示图像如何进行重复平铺,可能的值有repeat(在水平和垂直方向上均进行重复平铺,这也是默认值)、repeat-x(只在水平方向上重复平铺)、repeat-y(只在垂直方向上重复平铺)、no-repeat(只铺一次,不进行重复平铺)。

    下面,我们就来看一个具体的例子。我们将如下图所示的图像(宽度和高度均为20px),在canvas指定的矩形区域中进行不同方式的平铺,并查看对应的图形效果。

    用于平铺的图片:用于平铺的图片(注意:原图片已丢失,此处放置的是一个类似的图片,只是颜色略有差异)。

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>HTML5 CanvasPattern实现图像平铺的入门示例</title>
    6. </head>
    7. <body>

    8. <!-- 添加canvas标签,并加上红色边框以便于在页面上查看 -->
    9. <canvas id="myCanvas" width="400px" height="300px" style="border: 1px solid red;">
    10. 您的浏览器不支持canvas标签。
    11. </canvas>

    12. <script type="text/javascript">
    13. //获取Canvas对象(画布)
    14. var canvas = document.getElementById("myCanvas");
    15. //简单地检测当前浏览器是否支持Canvas对象,以免在一些不支持html5的浏览器中提示语法错误
    16. if(canvas.getContext){  
    17.     //获取对应的CanvasRenderingContext2D对象(画笔)
    18.     var ctx = canvas.getContext("2d");  
    19.    
    20.     //创建一个表示图片的Image对象
    21.     var img = new Image();
    22.     //指定图片的URL
    23.     img.src = "http://www.365mini.com/static/upload/image/info.png";
    24.     //当图片加载完毕后再设置对应的图像平铺模式并填充矩形
    25.     img.onload = function(){
    26.         //创建CanvasPattern对象,指定上述图片进行水平和垂直方向的重复平铺
    27.         var pattern = ctx.createPattern(img, "repeat");
    28.         ctx.fillStyle = pattern;
    29.         //从坐标点(0,0)开始,绘制并填充宽度为200px、高度为100px的矩形
    30.         ctx.fillRect(0, 0, 200, 100);      
    31.     }
    32. }
    33. </script>
    34. </body>
    35. </html>

    对应的显示效果如下:运行代码

    repeat:水平方向和垂直方向均重复平铺repeat:水平方向和垂直方向均重复平铺

    值得注意的是,如上述代码所示,如果createPattern()方法的image参数值不是当前页面一个已经存在的Image对象或Canvas对象,那么我们需要等待浏览器将图片加载完毕后才能调用createPattern()方法及后续操作,否则将无法正确显示对应的图形。

    接着,我们将createPattern()方法的第2个参数repetitionStyle改为其他可能的值并分别查看对应的图形效果。

    repeat-x:只在水平方向上重复平铺repeat-x:只在水平方向上重复平铺

    repeat-y:只在垂直方向上重复平铺repeat-y:只在垂直方向上重复平铺

    no-repeat:不进行重复平铺no-repeat:不进行重复平铺

    此外,有一点尤为需要注意,CanvasPattern对象开始平铺图像的参考起点并不是我们当前绘制图形的左上角,而是整个canvas画布的左上角,确切地说,即canvas的起点坐标(0,0)。在上面的例子中,我们的矩形的起始坐标点也是(0,0),所以看不出有什么区别。现在,我们将矩形的起始坐标点改为(10,10),我们再来看看绘制的图形效果。

    1. <script type="text/javascript">
    2. //获取Canvas对象(画布)
    3. var canvas = document.getElementById("myCanvas");
    4. //简单地检测当前浏览器是否支持Canvas对象,以免在一些不支持html5的浏览器中提示语法错误
    5. if(canvas.getContext){
    6.     //获取对应的CanvasRenderingContext2D对象(画笔)
    7.     var ctx = canvas.getContext("2d");
    8.     //创建一个表示图片的Image对象
    9.     var img = new Image();
    10.     //指定图片的URL
    11.     img.src = "http://www.365mini.com/static/upload/image/info.png";
    12.     //当图片加载完毕后再设置对应的图像平铺模式并填充矩形
    13.     img.onload = function(){
    14.         //创建CanvasPattern对象,指定上述图片进行水平和垂直方向的重复平铺
    15.         var pattern = ctx.createPattern(img, "repeat");
    16.         ctx.fillStyle = pattern;
    17.         //从坐标点(10,10)开始,绘制并填充宽度为200px、高度为100px的矩形
    18.         ctx.fillRect(10, 10, 200, 100);
    19.     }
    20. }
    21. </script>

    对应的显示效果如下:运行代码

    矩形起点坐标更改后的图像平铺效果矩形起点坐标更改后的图像平铺效果

    在上面的示例代码中,我们用于平铺的图像没有变、矩形的大小也没有,仅仅只更改了矩形的起点坐标,就出现了上述不同的效果。这就是因为CanvasPattern对象平铺图像的参考起点坐标就是canvas画布的起点坐标。

    你可以这样理解,我们的图像就是直接平铺在canvas上的,只是默认情况下,这些图像都不可见。当我们绘制图形时,该图形所在区域的图像才会显示出来。你可以参考下面几个例子,以帮助理解。

    更改矩形起点为(20,20),repeat更改矩形起点为(20,20),repeat

    更改矩形起点为(30,30),repeat-x更改矩形起点为(30,30),repeat-x

    绘制一个等边直角三角形,repeat绘制一个等边直角三角形,repeat

    注意:到目前为止,FireFox浏览器对该对象的支持存在bug,你所期望的效果可能和实际显示效果不一致。

    本文来自:http://www.365mini.com/page/html5-canvaspattern.htm

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
    收藏收藏 分享分享 支持支持 反对反对 微信
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2024-4-19 18:46 , Processed in 0.079538 second(s), 30 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表