Canvas應用

大猿猴發表於2018-12-16

Canvas API

屬性

  • width
  • height

注意:在canvas標籤中宣告屬性width=1000,與應用樣式width:1000px或width:1000是不同的,在使用canvas API上會有偏差,必須使用前者進行宣告,height亦是如此

方法

  • getContext(contextId)

    獲取CanvasRenderingContext2D物件並返回

  • toDataURL([type][,level])

    將畫布轉化為指定型別的圖片,並返回圖片的url。若型別為image/jpeg,還可指定質量等級,值在0到1之間

CanvasRenderingContext2D API

屬性

  • fillStyle

    表示填充風格

  • strokeStyle

    表示輪廓風格

  • globalAlpha

    設定影象透明度

  • globalCompositeOperation

    設定重疊影象的覆蓋方式,可取值如下,

    • source-over:預設值,顯示源和匯的差集、源的交集
    • destination-over:顯示源和匯的差集、匯的交集
    • source-in:只顯示源的交集
    • destination-in:只顯示匯的交集
    • source-out:只顯示源的差集
    • destination-out:只顯示匯的差集
    • lighter:顯示源和匯的差集、交集混合顏色變淡
    • darker:顯示源和匯的差集、交集混合顏色變深
    • xor:顯示源和匯的差集
    • source-atop:只顯示源的差集
    • destination-atop:顯示匯的交集和源的差集
    • copy:顯示源
  • lineCap

    表示線段的箭頭樣式,可取值為butt、round、square,預設值為butt,表示頭尾為長方形,round表示頭尾為半圓形,square表示頭尾增加一個長方形,其長為線寬的一半,高為線寬

  • lineJoin

    表示線段的連線方式,可取值為miter、round、bevel,預設值為miter,線段在連線處外側延伸直至交於一點,若外延交點距離大於限制值是表現為bevel風格,其連線處為斜角,round連線處為一個圓角,半徑為線寬

  • lineWidth

    表示線段的線寬

  • miterLimit

    表示線段連線處的斜率

  • shadowBlur

    陰影模糊等級,值範圍為不小於0

  • shadowColor

    陰影顏色

  • shadowOffsetX

    陰影X偏移量

  • shadowOffsetY

    陰影Y偏移量

  • font

  • textAlign

  • textBaseline

方法

  • restore()

    恢復至上次儲存的繪圖狀態,包括所有屬性和transform、clip兩個方法

  • save()

    儲存當前繪圖狀態

  • scale(x,y)

    分別在x和y軸方向上按指定比例縮放

  • translate(x,y)

    分別在x和y軸方向上按指定值偏移,實質上是可以看做是畫布參考座標系上的原點的移動

  • rotate(angle)

    順時針旋轉angle度

  • transform(m11,m12,m21,m22,dx,dy)

    乘上如下矩陣進行變換,

        m11 m21 dx
        m21 m22 dy
        0   0   1
    複製程式碼
  • setTransform(m11,m12,m21,m22,dx,dy)

    重設變換矩陣

  • createLinearGradient(x0,y0,x1,y1)

    線性漸變

  • createRadialGradient(x0,y0,r0,x1,y1,r1)

    徑向漸變,返回一個漸變物件,有如下方法,

      addColorStop(point,color)
    複製程式碼

    用於新增漸變顏色點,point值在0至1之間

  • createPattern(image,repetition)

    指定影象和重複方向建立畫布圖案物件,repetition可取值為repeat、repeat-x、repeat-y和no-repeat

  • arc(x,y,r,a0,a1)

    畫弧

  • arcTo(x1,y1,x2,y2,radiu)

    繪製路徑中最後一個點(x0,y0)分別和點(x1,y1)、(x2,y2)構成的兩條直線間半徑為radiu的最短弧長

  • rect(x,y,w,h)

    畫矩形

  • bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)

    三次貝塞爾曲線

  • quadraticCurveTo(cpx,cpy,x,y)

    二次貝塞爾曲線

  • clearRect(x,y,w,h)

    清除矩形內的畫素

  • fillRect(x,y,w,h)

    繪製填充矩形

  • strokeRect(x,y,w,h)

    繪製輪廓矩形

  • moveTo(x,y)

    移動到指定位置

  • lineTo(x,y)

    畫線到指定位置

  • beginPath()

    開始新的子路徑

  • closePath()

    關閉子路徑

  • isPointInPath(x,y)

    判斷點(x,y)是否在當前路徑

  • fill()

    填充方式繪製

  • stroke()

    輪廓方式繪製

  • clip()

    裁切路徑,只顯示裁切區域的內容

  • fillText(text,x,y[,maxWidth])

  • strokeText(text,x,y[,maxWidth])

  • drawImage(image,dx,dy)

  • drawImage(image,dx,dy,dw,dh)

  • drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)

  • createImageData(sw,sh)/createImageData(imagedata)

    指定寬高或明確寬高的影象,建立ImageData物件

  • getImageData(sx,sy,sw,sh)

    獲取指定圖形區域的ImageData物件

  • putImageData(imagedata,dx,dy[,dirtyX,dirtyY,dirtyWidth,dirtyHeight])

    在繪圖畫布上繪製給定的ImageData物件

應用

碰撞球

效果如下,

Canvas應用
貼上與canvas相關的程式碼,

//畫線
function drawLine(context, x0, y0, x1, y1, color) {
   context.save();

   context.beginPath();

   if (color == null) {
       context.strokeStyle = "#A7AEB0";
   } else {
       context.strokeStyle = color;
   }
   context.moveTo(x0, y0);
   context.lineTo(x1, y1);
   context.stroke();

   context.closePath();

   context.restore();
}

//畫球
function draw3DBall(context, x0, y0, c0, c1) {
   context.save();

   context.beginPath();

   context.translate(x0, y0);

   var gradient = context.createRadialGradient(3, 3, 0, 0, 0, 10);
   if (c0 == null) {
       gradient.addColorStop(0, "#eee");
   } else {
       gradient.addColorStop(0, c0);
   }
   if (c1 == null) {
       gradient.addColorStop(1, "#57BADA");
   } else {
       gradient.addColorStop(0, c1);
   }
   context.fillStyle = gradient;
   context.arc(0, 0, 10, 0, 2 * Math.PI);
   context.fill();

   context.closePath();

   context.restore();
}
複製程式碼

原始碼地址,

https://github.com/muzhidong/frontend-demo/tree/master/collidedball
複製程式碼

旗幟

效果如下,

Canvas應用
貼上與canvas相關的程式碼,

//畫旗幟
function drawFlag(x0, y0, x1, y1, offsetX) {

    con.beginPath();

    con.moveTo(x0, y0 + 50 * Math.sin(offsetX * Math.PI * 2 / (x1 - x0)));
    for (var i = 1; i <= x1 - x0; i++) {
        con.lineTo(x0 + i, y0 + 50 * Math.sin((offsetX + i) * Math.PI * 2 / (x1 - x0)));
    }
    con.lineTo(x1, y1 + 50 * Math.sin(offsetX * Math.PI * 2 / (x1 - x0)));
    for (var j = 1; j <= x1 - x0; j++) {
        con.lineTo(x1 - j, y1 + 50 * Math.sin((offsetX + x1 - x0 - j) * Math.PI * 2 / (x1 - x0)));
    }
    con.lineTo(x0, y0 + 50 * Math.sin(offsetX * Math.PI * 2 / (x1 - x0)));

    con.closePath();

    con.fillStyle = "#1890ff";
    con.fill();
}
複製程式碼

原始碼地址,

https://github.com/muzhidong/frontend-demo/tree/master/flutteredflag
複製程式碼

放大鏡

放大鏡效果已封裝成一個外掛使用,具體可訪問下面連結,

https://github.com/muzhidong/magnify
複製程式碼

相關文章