• canvas学习笔记1——canvas基础应用


    前言

      小时候经常能在网页上看到一些酷炫的动态效果,让整个页面的展示效果得到很好的升华,后来知道了那些效果都是使用flash实现的。而flash虽然在制作动态效果上非常的强大与全能,但其在IOS的移动端得不到有效的支持。如果没有flash,我们就不能制作好看的特效动画了吗?答案当然是我们可以通过其它手段来实现酷炫动效的实现。

      W3C一直致力于提升WEB的性能和技术规范,在HTML5中,有一个新的标签<canvas>专门用来定义图形,这个标签还提供了一系列的API,即我们可以通过HTML5+CSS+JS的组合来完成图形的绘制、动态效果的实现。

    <canvas> 标签简介

    1.定义

      <canvas> 标签的定义非常的简单,但我们一定要明白一个事实:<canvas> 标签只是一个画布容器,图形绘制的所有工作都是由JS脚本完成的

    官方定义 说明
    <canvas> 标签定义图形,比如图表和其他图像 使用这个标签,我们可以用来定义图形,比如一条直线、一个三角形、一个矩形等,或者是他们组合在一起的复杂图形
    <canvas> 标签只是图形容器,您必须使用脚本来绘制图形 <canvas> 标签仅仅是提供了一个绘制图形的容器,它不提供绘画的功能。通俗的说,我们在现实里面画画,通常需要有画布、画笔等,<canvas> 标签就是其中的画布,而想要在这个<canvas> 标签上绘制我们想要的图形,还需要画笔来完成。而这个画笔就是JS代码。也就是说,我们的绘图工作全部是在JS中完成的,<canvas> 标签只是给我们框定了一个图形的大小和位置而已。

    2.属性

      <canvas> 标签只有2个属性,具体如下:

    属性名 描述
    height pixels 设置canvas的高度
    width pixels 设置canvas的宽度

     

      <canvas> 标签虽然也是HTML元素,但是和普通的HTML元素最大的区别就在这个宽高的设置上。通常我们设置一个元素的宽高,都习惯使用CSS里面的width和height属性来控制,但<canvas> 标签有自己的宽高属性,其宽高必须通过这两个属性来设置才有效。

     

    <!--正确-->
    <canvas id="digits" width="800" height="600"></canvas>
    <!--不正确-->
    <canvas id="digits" style="800px;height:600px;"></canvas>

     

    为什么使用CSS来设置<canvas>标签的宽高是不正确的呢?

    当我们在HTML中建立一个空的<div>标签且不对它进行任何CSS设置时,那么这个<div>标签会默认宽度为0,高度为0,也就是它不会占据页面中的一丁点空间,仿佛不存在。这个情况适用于大部分的HTML标签,但<canvas>标签不吃这一套。

    当我们在HTML中建立一个空的<canvas>标签且不对它进行任何CSS设置时,它的默认宽度是350px,高度则是150px。也就是说<canvas>标签一旦创建,那么就会在页面中占据350*150的空间,这个大小可以通过它自己提供的两个属性来修改。如果我们不是通过它自己提供的两个属性来修改,而是使用CSS来修改宽高,实际上并不是改变画布的容器大小,而是对这个画布进行了横向和纵向的拉伸,就比如一个图片的宽高是350*150,我们通过CSS设置它的宽变成800,高变成600。那么你会发现整个图片都变形了,不再是原来的比例了。这也是为什么我们不要通过CSS来设置<canvas>标签的宽高的原因。

    使用<canvas>标签进行基础图形绘制的方法

    在此只列举一些基础的应用方法,更多详细的API接口可通过该网址了解:http://www.w3school.com.cn/tags/html_ref_canvas.asp

     1.绘制矩形

      矩形是唯一可以直接在2D上下文中绘制的形状。与矩形有关的方法包括fillRect()、strokeRect()、clearRect()。这三个方法都接受4个参数,即矩形的x坐标,y坐标,矩形的宽度,矩形的高度。(x,y)指矩形的左上角位置。

    绘制图形如下:

    代码如下:

    <canvas id="myCanvas"></canvas>   <!--创建canvas画布元素-->
    
    <script type="text/javascript">
    var canvas=document.getElementById('myCanvas'); //获取画布元素 var ctx=canvas.getContext('2d'); //获取'2d'绘图上下文环境,也就是获取绘图API,此时的ctx就是我们的画笔,它拥有许多绘图的方法。

    //绘制填充矩形 ctx.fillStyle
    ='#FF0000'; //表示绘制的矩形内部的填充颜色 ctx.fillRect(0,0,80,100); //填充矩形,参数表示(起点x坐标,起点y坐标,宽度,高度)。此处表示从画布的(0,0)位置开始绘制,宽度是80px,高度是100px.
    //绘制非填充矩形(描边矩形)
    ctx.strokeStyle='#FF0000'; //表示描边的颜色
    ctx.strokeRect(80,100,80,50); //描边矩形,参数意义同上

    //ctx.clearRect(0,0,350,150); //表示清除画布中一个矩形区域内的内容,这个方法是后面创建动效的关键所在。
    </script>

      以上代码是canvas最基本的使用形式,首先在HTML中创建一个<canvas> 标签,然后在js脚本中通过ID获取这个容器元素。之后的这一步很重要,正如前面所述,<canvas> 标签本身并不具有绘制的功能,它只是提供一个容器或者说一个画布的功能,真正负责进行图形绘制的是画笔,这个画笔就是通过getContext()方法进行创建的。代码中的canvas.getContext('2d')就是指获取canvas这个画布元素的2d绘图上下文环境,之后通过这个上下文环境上定义的各种绘图API进行图形的绘制。

      (注:getContext('2d')中的'2d'表示调用的是绘制二维平面图形的API)

     2.绘制路径

      2D绘制上下文支持很多在画布上绘制路径的方法。通过路径可以创造出复杂的形状和线条。要绘制路径必须首先调用beginPath()方法,表示要开始绘制新的路径。然后再通过调用下列方法来实际绘制路径。

    • arc(x,y,radius,startAngle,endAngle,counterclockwise):以(x,y)作为圆心绘制一条弧线,弧线的半径是radius,起始角度是starAngle,结束角度是endAngle,最后一个参数表示是顺时针还是逆时针绘制(值为false时表示顺时针绘制)。
    • arcTo(x1,y1,x2,y2,radius):从上一点开始绘制一条弧线,到(x2,y2)为止,并且以给定的半径radius穿过(x1,y1)。
    • lineTo(x,y):从上一点开始绘制一条直线,到(x,y)为止。
    • moveTo(x,y):将绘图游标移动到(x,y),不画线。
    • rect(x,y,width,height):从点(x,y)开始绘制一个矩形,宽度和高度分别由width和height指定。这个方法绘制的是矩形路径,而不是strokeRect()和fillRect()所绘制的独立的形状

      创建了路径后,接下来有几种可能的选择。如果想绘制一条连接到路径起点的线条,可以调用closePath()。如果路径已经完成,你想用fillStyle()填充它,可以调用fill()方法。另外,还可以调用stroke()方法对路径描边,描边使用的是strokeStyle。最后还可以调用clip(),这个方法可以在路径上创建一个剪切局域。

    路径绘制如下:

     

    代码如下:

     

    <canvas id="myCanvas" width="800" height="600"></canvas>   <!--创建canvas画布元素-->
    
    <script type="text/javascript">
    
        var canvas=document.getElementById('myCanvas');   //获取画布元素
        var ctx=canvas.getContext('2d');   //获取'2d'绘图上下文环境,也就是获取绘图API
    
        //绘制一个填充的圆形
        ctx.fillStyle='#FF0000';    //表示绘制的路径内部的填充颜色
        ctx.beginPath();
        ctx.arc(100,100,50,0,Math.PI*2,false);
        ctx.fill();  //调用该方法进行填充
    
        //绘制一条直线
        ctx.strokeStyle="#FF0000";  //表示绘制的描边的填充颜色
        ctx.beginPath();
        ctx.moveTo(200,200);
        ctx.lineTo(300,300);
        ctx.stroke();  //调用该方法进行描边和路径绘制
    
        //绘制矩形路径
        ctx.beginPath();
        ctx.rect(400,400,100,100);
        ctx.stroke();
        
    </script>

     3.绘制文本

      文本与图形总是如影随形。为此,2D绘图上下文也提供了绘制文本的方法。绘制文本主要有两个方法:fillText()、strokeText()。这两个方法也可以接受4个参数:要绘制的文本字符串、x坐标、y坐标、可选的最大像素宽度。而且,这两个方法都以下列3个属性为基础。

    • font:表示文本样式、大小及字体,用CSS中指定字体格式来指定,例如“10px Arial”。
    • textAlign:表示文本的对齐方式。可能的值有"start"、"end"、"left"、"right"、"center"。(建议使用"start"、"end",不要使用"left" 和"right",因为前两者的意思更稳妥,能同时适合从左到右和从右到左显示的语言)
    • textBaseline:表示文本的基线。可能的值有"top"、"hanging"、"middle"、"alphabetic"、"ideographic"和"bottom"。

      这几个属性都有默认值,因此没有必要每次使用它们都重新设置一遍值。fillText()方法使用fillStyle属性绘制文本,而strokeText()方法使用strokeStyle属性为文本描边。相对来说,还是使用fillStyle()的时候更多。

    文字绘制如下:

    代码如下:

    <canvas id="myCanvas" width="800" height="600"></canvas>   <!--创建canvas画布元素-->
    
    <script type="text/javascript">
    
        var canvas=document.getElementById('myCanvas');   //获取画布元素
        var ctx=canvas.getContext('2d');   //获取'2d'绘图上下文环境,也就是获取绘图API
    
        //绘制一个填充的圆形
        ctx.fillStyle='#FF0000';    //表示绘制的路径内部的填充颜色
        ctx.beginPath();
        ctx.arc(100,100,50,0,Math.PI*2,false);
        ctx.fill();  //调用该方法进行填充
    
        //绘制文字
        ctx.font="bold 14px Arial";
        ctx.textAlign="center";
        ctx.textBaseline="middle";
        ctx.fillText("你好",100,40);
    
    </script>

     4.绘制图像

      2D绘图上下文内置了对图像的支持。如果你想把一幅图像绘制到画布上,可以使用drawImage()方法。根据期望的最终结果不同,调用这个方法时,可以使用三种不同的参数组合。最简单的调用方式是传入一个HTML<img>元素,以及绘制该图像的起点的x和y坐标。例如:

    var image=document.images[0];
    ctx.drawImage(image,10,10);

      这两行代码取得了文档中的第一幅图像(也可以传入另一个canvas,这样就会将另一个canvas上的图形绘制到此处),然后将它绘制到上下文中,起点为(10,10)。绘制到画布上的图像大小和原始大小一样。如果你想改变绘制后图像的大小,可以再多传入两个参数,分别表示目标宽度和目标高度。通过这种方式来缩放图像并不会影响上下文的变换矩阵。例如:

    ctx.drawImage(image,50,10,20,30);

      上面代码中的50表示原图的宽,10表示原图的高,后面的20和30表示绘制出来的图像宽高为20和30像素。

      drawImage()非常的灵活,根据参数的设置,可以实现很多的功能,从左到右可以传入9个参数:要绘制的图像、源图像的x坐标、源图像的y坐标、源图像的宽度、源图像的高度、目标图像的x坐标、目标图像的y坐标、目标图像的宽度、目标图像的高度。例如:

    ctx.drawImage(image,0,10,50,50,0,100,40,60);

      上面的代码表示,将image图像中坐标(0,10)位置,大小为50*50的图像绘制到画布中(0,100)位置,大小为40*60的区域中。(单位皆为像素)。

     效果如下:

     以上即为canvas的四种基本绘制方式,通过组合它们以及调用更多进阶的api功能,我们能够实现非常复杂的图形绘制,甚至进行动效的制作。

     

     

  • 相关阅读:
    Linux编程之自定义消息队列
    MVC5学习系列--Razor视图(一)
    JS将秒转换为 天-时-分-秒
    自己封装了一个EF的上下文类.,分享一下,顺便求大神指点
    VS2015企业版,社区版,专业版详细对比
    [干货来袭]C#6.0新特性
    WebApp上滑加载数据...
    用SignalR 2.0开发客服系统[系列5:使用SignalR的中文简体语言包和其他技术点]
    用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]
    用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
  • 原文地址:https://www.cnblogs.com/zhangjunfeng/p/6874025.html
Copyright © 2020-2023  润新知