美文网首页
MDN文档 canvas教程笔记

MDN文档 canvas教程笔记

作者: codeflame | 来源:发表于2019-05-20 16:21 被阅读0次

    MDN Canvas教程
    API Canvas​Rendering​Context2Dcanvas.getContext('2d')返回的对象类型,几乎所有作图操作基于这个“上下文对象”而非canvas dom,下文以context2D作简称


    只有矩形、文本、图片是可直接绘制显示的

    fillRect(x, y, width, height)
    绘制一个填充的矩形
    strokeRect(x, y, width, height)
    绘制一个矩形的边框
    clearRect(x, y, width, height)
    清除指定矩形区域,让清除部分完全透明。
    fillText(text, x, y [, maxWidth])
    在(x,y)位置绘制(填充)文本。
    strokeText(text, x, y [, maxWidth])
    在(x,y)位置绘制(描边)文本。
    drawImage(image, dx, dy [, dWidth, dHeight])
    drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
    在(x,y)位置绘制图像。

    其他均需要路径

    beginPath()
    新建一条路径
    closePath()
    闭合路径(即路径没有闭合时,从当前点生成一条直线路径连到起始点,使其闭合)
    stroke()
    绘制路径(即描边)
    fill()
    (根据设置)填充路径内部

    路径

    context2D路径方法(省略参数):
    moveTo()
    将一个新的子路径的起始点移动到(x,y)坐标。
    lineTo()
    使用直线连接子路径的终点到 x, y 坐标。
    quadraticCurveTo()
    添加一条二次贝赛尔曲线到当前路径。
    bezierCurveTo()
    添加一条三次贝赛尔曲线到当前路径。
    arc()
    添加一条圆弧路径。
    arcTo()
    根据控制点和半径添加一条圆弧路径(同时使用直线连接前一个点,原因下面解释)
    ellipse()
    添加一条椭圆路径。
    rect()
    创建一条矩形路径,矩形的起点位置是 (x, y) ,尺寸为 width 和 height。

    额外
    Path2D:直接的路径对象,其具有的方法context2D均有。可作stroke()和fill()的参数而被绘制。意义在于分离出“路径”,从而在多个canvas上重复绘制,更加灵活。
    同时可以使用SVG path data来初始化,如new Path2D("M10 10 h 80 v 80 h -80 Z");

    样式、变形等

    1.颜色、线段粗细、字体、全局透明度等,直接操作context2D的属性。
    最常用是fill​Style和strokeStyle。可以对其直接赋值#000rgba(0,0,0,0)等颜色,也可赋值为createLinearGradient(x1, y1, x2, y2)createRadialGradient(x1, y1, r1, x2, y2, r2)等对象创建的“渐变对象”。

    2.变形、虚线距离等,通过context2D的方法操作
    虚线:setLineDash(segments)。segments是一个Array数组,描述交替绘制线段和间距长度的数字。 如果数组元素的数量是奇数, 数组的元素会被复制并重复。例如, [5, 15, 25] 会变成 [5, 15, 25, 5, 15, 25]。取消虚线可直接设为空数组[]
    变形:类似于css的transform属性的各个可用函数。如translate()、rotate()、scale()

    重要
    复杂作图时,经常需要变换原点进行旋转、绘图,或切换颜色、线宽,此时可用save()restore()方法以“栈”结构保存若干设置。


    额外

    1.当前路径为空,即调用beginPath()之后,或者canvas刚建的时候,第一条路径构造命令通常被视为是moveTo(),无论实际上是什么。如:
    lineTo(10,10);被视为moveTo(10,10);
    arc(0,0,50,0,Math.PI*2);被视为moveTo(0,50);arc(0,0,50,0,Math.PI*2);,即作圆时第一个下笔的点被作为moveTo的点,然后继续作圆

    2.所有没有moveTo的跳跃性路径操作,被视为直线路径连接,如:
    moveTo(100,100);arc(0,0,50,0,Math.PI*2);绘制后将发现有一条直线从(100,100)连到(0,50),即从当前点连线到作圆时第一个下笔的点。为了避免这种情况,最简单的方法就是重新beginPath()新开一条路径

    3.isPointInPath()、isPointInStroke():前者判断某点是否在闭合路径内部,后者判断是否在“边”上。
    关于如何判断内部,有:
    (1)"evenodd": 奇偶环绕规则
    以该点为端点,作一条足够长的射线,方向任意。如果与路径(边)相交次数为奇数,则在内部;偶数则在外部。
    (2)"nonzero": 非零环绕规则(默认值)
    以该点为端点,作一条足够长的射线,方向任意。以该射线为主视角,起始值为0,如果某条路径从左往右穿过,则+1;从右往左穿过,则-1;计算最终的值,如果非0,则在内部;如果为0,则在外部。
    注意:我们无需确保每个方向的射线的最终值都一样。即可能90°算到是1,而180°算到是-1,最终他们都是“非0”,结果是一致的。

    相关文章

      网友评论

          本文标题:MDN文档 canvas教程笔记

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