我的家園

          我的家園

          HTML5 canvas 元素詳細(xì)教程六

          Posted on 2012-04-15 16:37 zljpp 閱讀(127) 評論(0)  編輯  收藏

          HTML5 canvas 元素詳細(xì)教程六:組合。

          之前的例子里面,我們總是將一個圖形畫在另一個之上,大多數(shù)情況下,這樣是不夠的。比如說,它這樣受制于圖形的繪制順序。不過,我們可以利用 globalCompositeOperation 屬性來改變這些做法。

          globalCompositeOperation

          我們不僅可以在已有圖形后面再畫新圖形,還可以用來遮蓋,清除(比 clearRect 方法強(qiáng)勁得多)某些區(qū)域。

          globalCompositeOperation = type

          type 是下面 12 種字符串值之一:

          注意:下面所有例子中,藍(lán)色方塊是先繪制的,即“已有的 canvas 內(nèi)容”,紅色圓形是后面繪制,即“新圖形”。

          source-over (default)

          這是默認(rèn)設(shè)置,新圖形會覆蓋在原有內(nèi)容之上。

          Canvas source over

          destination-over

          會在原有內(nèi)容之下繪制新圖形。

          Canvas destination over

          source-in

          新圖形會僅僅出現(xiàn)與原有內(nèi)容重疊的部分。其它區(qū)域都變成透明的。

          Canvas source in

          destination-in

          原有內(nèi)容中與新圖形重疊的部分會被保留,其它區(qū)域都變成透明的。

          Image:Canvas_composite_destin.png

          source-out

          結(jié)果是只有新圖形中與原有內(nèi)容不重疊的部分會被繪制出來。

          Image:Canvas_composite_srcout.png

          destination-out

          原有內(nèi)容中與新圖形不重疊的部分會被保留。

          Image:Canvas_composite_destout.png

          source-atop

          新圖形中與原有內(nèi)容重疊的部分會被繪制,并覆蓋于原有內(nèi)容之上。

          Image:Canvas_composite_srcatop.png

          destination-atop

          原有內(nèi)容中與新內(nèi)容重疊的部分會被保留,并會在原有內(nèi)容之下繪制新圖形

          Image:Canvas_composite_destatop.png

          lighter

          兩圖形中重疊部分作加色處理。

          Image:Canvas_composite_lighten.png

          darker

          兩圖形中重疊的部分作減色處理。

          Image:Canvas_composite_darken.png

          xor

          重疊的部分會變成透明。

          Image:Canvas_composite_xor.png

          copy

          只有新圖形會被保留,其它都被清除掉。

          Image:Canvas_composite_copy.png

          注意:copy 和 darker 屬性值在 Gecko 1.8 型的瀏覽器(Firefox 1.5 betas,等等)上暫時還無效。

          裁切路徑 Clipping paths

          Canvas clipping path裁切路徑和普通的 canvas 圖形差不多,不同的是它的作用是遮罩,用來隱藏沒有遮罩的部分。如右圖所示。紅邊五角星就是裁切路徑,所有在路徑以外的部分都不會在 canvas 上繪制出來。

          如果和上面介紹的 globalCompositeOperation 屬性作一比較,它可以實現(xiàn)與source-in 和 source-atop 差不多的效果。最重要的區(qū)別是裁切路徑不會在 canvas 上繪制東西,而且它永遠(yuǎn)不受新圖形的影響。這些特性使得它在特定區(qū)域里繪制圖形時相當(dāng)好用。

          在 繪制圖形 一章中,我只介紹了 stroke 和 fill 方法,這里介紹第三個方法clip

          clip()

          我們用 clip 方法來創(chuàng)建一個新的裁切路徑。默認(rèn)情況下,canvas 有一個與它自身一樣大的裁切路徑(也就是沒有裁切效果)。

          clip 的例子

          clip這個例子,我會用一個圓形的裁切路徑來限制隨機(jī)星星的繪制區(qū)域。

          首先,我畫了一個與 canvas 一樣大小的黑色方形作為背景,然后移動原點至中心點。然后用 clip 方法創(chuàng)建一個弧形的裁切路徑。裁切路徑也屬于 canvas 狀態(tài)的一部分,可以被保存起來。如果我們在創(chuàng)建新裁切路徑時想保留原來的裁切路徑,我們需要做的就是保存一下 canvas 的狀態(tài)。

          裁切路徑創(chuàng)建之后所有出現(xiàn)在它里面的東西才會畫出來。在畫線性漸變時這個就更加明顯了。然后在隨機(jī)位置繪制 50 大小不一(經(jīng)過縮放)的顆,當(dāng)然也只有在裁切路徑里面的星星才會繪制出來。

           function draw() {
          var ctx = document.getElementById('canvas').getContext('2d');
          ctx.fillRect(0,0,150,150);
          ctx.translate(75,75);
          // Create a circular clipping path
          ctx.beginPath();
          ctx.arc(0,0,60,0,Math.PI*2,true);
          ctx.clip();
          // draw background
          var lingrad = ctx.createLinearGradient(0,-75,0,75);
          lingrad.addColorStop(0, '#232256');
          lingrad.addColorStop(1, '#143778');
          ctx.fillStyle = lingrad;
          ctx.fillRect(-75,-75,150,150);
          // draw stars
          for (var j=1;j<50;j++){
          ctx.save();
          ctx.fillStyle = '#fff';
          ctx.translate(75-Math.floor(Math.random()*150),
          75-Math.floor(Math.random()*150));
          drawStar(ctx,Math.floor(Math.random()*4)+2);
          ctx.restore();
          }
          }
          function drawStar(ctx,r){
          ctx.save();
          ctx.beginPath()
          ctx.moveTo(r,0);
          for (var i=0;i<9;i++){
          ctx.rotate(Math.PI/5);
          if(i%2 == 0) {
          ctx.lineTo((r/0.525731)*0.200811,0);
          } else {
          ctx.lineTo(r,0);
          }
          }
          ctx.closePath();
          ctx.fill();
          ctx.restore();
          }

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 梁平县| 南川市| 北海市| 湖州市| 梁山县| 岢岚县| 醴陵市| 庆云县| 洛南县| 石棉县| 巴林右旗| 新竹县| 鱼台县| 龙岩市| 九寨沟县| 吉林市| 兴宁市| 华阴市| 彩票| 辉南县| 济阳县| 西华县| 边坝县| 华阴市| 汕头市| 岚皋县| 岐山县| 资阳市| 吴江市| 长宁区| 镇赉县| 蓬溪县| 南阳市| 富阳市| 禄劝| 新田县| 隆化县| 镇雄县| 洞口县| 腾冲县| 永寿县|