HTML5 | Canvas中變數範圍與setInterval()方法的影響

來源:互聯網
上載者:User

標籤:不同   function   click   index   inpu   body   ack   多個   針對   

Demo - 隨機繪製圓環 實現思路:
  • 將一個圓環的繪製分成100份,setInterval()方法定義每隔時間n繪製一段新的,每份的開始路徑都是上一次的結束路徑,實現步進繪製。
  • 通過Math.random(),隨機產生圓的座標半徑顏色。
實現方法:
  1. 定義畫布和聯絡
  2. 設定步進屬性
  3. 設定隨機圓屬性(5個參數:x,y,半徑,開始,結束,方向)
  4. 迴圈執行繪畫

<<index.html>>

<!DOCTYPE html><html><head>    <meta charset="utf-8">    <style type="text/css">    #canvas {        border: 1px black solid;    }    </style></head><body>    <canvas id="canvas" width="1000" height="400">您的瀏覽器不支援canvas</canvas>    <input type="button" onclick="InitDraw()" value="draw">    <script type="text/javascript">    function InitDraw() {        var canvas = document.getElementById(‘canvas‘);        var ctx = canvas.getContext(‘2d‘);        var ctx2 = canvas.getContext(‘2d‘);        var step;        // var sAngle;        // var eAngle;        var x, y, r;        var add, stepTime, counterClockwise;        // 步進屬性        step = 0;        add = Math.PI * 2 / 100;        stepTime = 20;        // 隨機圓屬性        sAngle = 0;        eAngle = sAngle + add;        counterClockwise = false;        x = Math.random() * 800 + 100;        y = Math.random() * 200 + 100;        r = Math.random() * 50 + 50;        ctx.strokeStyle = "#" + (Math.random() * 0x1000000 << 0).toString(16);        ctx.shadowColor = "#" + (Math.random() * 0x1000000 << 0).toString(16);        console.log(ctx.strokeStyle);        console.log(ctx2.strokeStyle);        ctx.lineWidth = 1.0;        ctx.shadowOffsetX = 0;        ctx.shadowOffsetY = 0;        ctx.shadowBlur = 10;        // 畫圓        var drawID = setInterval(Draw, stepTime);        function Draw() {            if (step < 100) {                // 繪製路徑並畫                ctx.beginPath();                ctx.arc(x, y, r, sAngle, eAngle, counterClockwise);                ctx.stroke();                ctx.closePath();                // 步進                sAngle = eAngle;                eAngle += add;                // console.log("drawID:" + drawID + ",step:" + step);                // console.log(ctx.strokeStyle);                step++;            } else {                clearInterval(drawID);            }        }    }    </script></body></html>

 

在不同的變數環境下出現了不同的情況:
  1. 全域變數:step, sAngle, eAngle , x, y, r;

    在執行繪圖過程中持續變化的參數是step,sAngle,eAngle,再次調用時回到函數InitDraw();重新定義六個全域變數以及畫筆樣式,則重新開始繪圖。上一個step和畫筆樣式都停留在按下button的一刻

  2. 全域變數:sAngle, eAngle; 局部變數:var step, x, y, r;

    在控制台輸出情況可以看到,當起始位置為全域變數時相互幹擾的非常厲害,但因為step是局部變數,調用的是不同的副本,最後兩個圈均執行到了99。並且可以看到控制台中drawID是間隔出現的,對兩次setInterval方法輪流執行,也就造成了sAngle位置是跳躍的虛點。

       

  3. 局部變數:var step ,sAngle, eAngle, x, y, r;

    但要注意的是在該樣本中共用同一個畫布和聯絡(ctx),在這裡畫筆的顏色和樣式被重新整理成為新的。那麼應該如何在同一畫布中同時繪畫不同樣式?

       

  4. 全域變數:step; 局部變數:var sAngle, eAngle, x, y, r;

    在第二次點擊出現的圈繪到約半圈時停止

    點擊button重新執行InitDraw();step=0; 從列印資訊可以看到兩個不同的setInterval方法對step變數相互幹擾,直到step有機會到達99時停止繪圖。

       

  5. ...一共64種變化,謹慎定義Canvas中的變數範圍
關於Context的另一個測試:

在同一個畫布中調用擷取兩個Context,但通過輸出可以看到每個畫布只有一個對應的Context

   

經過幾個Demo的分析得到以下結論:

  • 在調用同一個function時候,私人變數互不相干,會像C一樣得到不同的副本各自存值
  • Canvas的Context樣式(strokeStyle/shadowColor/...)是針對該Canvas(畫布)唯一的,即
  • 如果同時調用setInterval方法,則輪流執行,1,2,1,2,1,2...以此類推
  • 謹慎使用setInterval方法,同時運行多個會導致相互幹擾

遺留問題:

  • 如何同時繪畫不同樣式?

HTML5 | Canvas中變數範圍與setInterval()方法的影響

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.