canvas

作者: 树袋熊熊 | 来源:发表于2017-12-15 10:40 被阅读0次

    canvas:html5 中的一个元素标签,使用js在网页上进行绘图。

    canvas 是一个矩形区域,有多种绘图路径:圆形、矩形、多边形


    创建canvas标签的步骤:

    html 页面: <canvas id="canvas"> 你的浏览器暂不支持 canvas 标签 </canvas>

    css:canvas 标签和其他标签一样支持css样式

    js:绘图部分是在 js 中完成的。canvas本身不具备绘图能力,需要 js 支持。

    1.首先获取 html 页面中的 canvas 标签

    var canvas = getElementById(" canvas ");

    2.创建 context 对象

     在创建 context 对象时,首先需要判断浏览器是否支持 canvas 标签。

       if(canvas.getContext("2d"))

      如果该对象存在,则开始绘图。

      var cxt = canvas.getContext( "2d" )

    3.绘图

    cxt.moveTo(x,y) --- 相当于虚拟笔尖开始的位置

    canvas有两个属性  width、height,设置画布大小。

    canvas.width = "700";

    canvas = "500";

    直线:使用 lineTo 绘制直线cxt.lineTo(x1,y1)  绘制一条从 (x,y) 到 (x1,y1) 的一条直线这只是你有绘制这样一条线的意图,是设置直线的状态,真正绘制需要使用 cxt.stroke()

    绘制多边形则是将多条线段连接在一起。

    绘制线条的样式:cxt.lineWidth 绘制线条的宽度,注意:不带单位。

                               cxt.strokeStyle : " #005588 ",也可使用rgb(0,125,125)、red的形式设置颜色

    线条的属性还有:lineCap、lineJoin、miterLimit

    lineCap(线条两端的线)有三个可选属性:butt(默认)、round(圆角)、square(直角)

    lineJoin(线条相交时的状态)有三种属性:miter(默认尖角)、bevel(斜交)、round(圆角)

    当lineJoin设置为miter时,外角、内角的距离达到miterLimit(默认值为10)时,则显示bevel效果。

    除了绘制图形外部线条以外,可以填充图形本身:cxt.fill()

    填充的颜色设置:cxt.fillStyle = rgb(0,125,125)

    绘制多个图像:每绘制一个图像,调用一次cxt.stroke(),所有的图像将被重绘一次。

    为解决重复绘制的问题,需要用到 cxt.beginPath() 和 cxt.closePath(),之间的代码执行一次,之后调用cxt.stroke()时不会将其覆盖 两者无需成对出现。

    cxt.beginPath():重新规划一个路径,清空之前的画布。

    cxt.closePath():将不封闭的图形起点、终点连接起来。对 cxt.fill 无用,cxt.fill() 自动连接成封闭图形。使用 cxt.stroke() 时,如果不想图形封闭起来,则去掉这句代码。

    弧线:使用 cxt.art() 绘制弧线


    在绘制弧线时,上面这张图是关键。图中标注的值是固定的。

    cxt.arc(  centerX  ,    centerY,    radius,starting angle,ending angle,anticlockwise = false)

                圆心x坐标,圆心x坐标,半径 , 起始弧度,    终点弧度,     默认顺时针绘制

    starting angle / ending angle 的写法:2*Math.PI

    cxt.arc(  centerX  ,    centerY,    radius, 0*Math.PI, 1.5*Math.PI, anticlockwise = false) 顺时针绘制

    cxt.arc(  centerX  ,    centerY,    radius, 0*Math.PI, 1.5*Math.PI, anticlockwise = true) 逆时针绘制

    图像:将图片绘制在画布上的步骤:

    1.var img = new Image();

    img.src=" xxx ";

    图形变换:translate(图形的起始位置,位移操作)、rotate(旋转)、scale(缩放)

    cxt.translate(100,100)  起始位置为(100,100)

    cxt.translate(300,300)  起始位置为(400,400)而不是(300,300)

    单条语句执行时不会有错误,但是当多条执行时,效果将会叠加。解决方案:使用cxt.save()、cxt.restore();两者成对出现,canvas状态的保存与恢复。在绘制图像前保存设置状态,在绘制结束时恢复绘制前的状态。

    scale(缩放):不仅会缩放图形大小,图形的边框也会被缩放
    渐变:分为线性渐变 createLinearGradient 和径向渐变 createRadialGradient 两种

    线性渐变:var grd = cxt.createLinearGradient (xstart,ystart,xend,yend); 两个坐标构成一条渐变色

    grd.addColorStop( stop,color ); stop为关键色位置(取值从0.0 - 1.0 的浮点数),color为关键颜色

    var grd = cxt.createLinearGradient 0,0,800,800);   倾斜渐变

    // var grd = createLinearGradient 0,0,0,800);  垂直渐变

    grd.addColorStop( 0.0,black );

    grd.addColorStop( 0.5,red );

    grd.addColorStop( 1.0,blue);
    cxt.fillStyle = grd;

    径向渐变:var grd = cxt.createRadialGradient (x0,y0,r0,x1,y1,r1);


    以上为不间断的线条,如果想绘制间断的线条,则需要多次写moveTo(),将虚拟笔尖移到不同的位置。


    注意:

    当 lineWidth 设置了一定的宽度后,用lineTo绘制封闭图形有个瑕疵。即因为 lineWidth 不能完全封闭,有个三角是不能被封闭。解决:使用 cxt.closePath();

    绘制有外边框的填充图时,应先填充内部颜色后,在绘制外边框。反过来的话,内部填充色会遮盖外边框。

    相关文章

      网友评论

          本文标题:canvas

          本文链接:https://www.haomeiwen.com/subject/pvdmjxtx.html