Canvas 實現流程動效


一, 總體思路

   canvas動效實現,主要分為兩步:

  1> 實現畫靜態圖函數,用於定時器反復調用。

  2> 通過定時器setInterval(),定時調用畫靜態圖函數。動效就是一次次的繪制靜態圖,而每一次繪制靜態圖,都改變繪制的位置,從而實現動效。

  canvas 基礎知識這里不再搬運,想了解的自行搜索。 

二, 實現效果

 

三, 源碼

  完整代碼, 可運行

  完全自己寫的,暫未優化, 歡迎大佬指點,交流

 

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">
    <title></title>
</head>
<body>
    <canvas id='canvas' width="1500px" height="500px"></canvas>
    <script type="text/javascript">
    
        var canv = document.getElementById('canvas')
        var ctx = canv.getContext('2d')
        var moveCount1 = 0 ,moveCount2 = 0, moveCount3 = 0, moveCount4 = 0, moveCount5 = 0, moveCount6 = 0, moveCount7 = 0, moveCount8 = 0, moveCount9 = 0   // 每段黃色線正向移動次數 
        
        setInterval(function(){  // 實現移動
            
            ctx.clearRect(0,0,1500,500)
            
            if(moveCount1 < 27) {   
                moveCount1++
            } else {
                moveCount1 = 0
            }

            if(moveCount2 < 8) {
                moveCount2++
            } else {
                moveCount2 = 0
            }

            if(moveCount3 < 7) {
                moveCount3++
            } else {
                moveCount3 = 0
            }

            if(moveCount4 < 6) {
                moveCount4++
            } else {
                moveCount4 = 0
            }

            if(moveCount5 < 20) {
                moveCount5++
            } else {
                moveCount5 = 0
            }

            if(moveCount6 < 20) {
                moveCount6++
            } else {
                moveCount6 = 0
            }

            if(moveCount7 < 8) {
                moveCount7++
            } else {
                moveCount7 = 0
            }    

            if(moveCount8 < 6) {
                moveCount8++
            } else {
                moveCount8 = 0
            }

            if(moveCount9 < 26) {
                moveCount9++
            } else {
                moveCount9 = 0
            }

            drawStatic()

            // 畫黃色線 走向不同 具體計算也不同 所以調了不同方法

            draMoveLineTop(moveCount1, 197, 249, 212, 235, 4, "#FFEC21")
            draMoveLineBotRight(moveCount2, 350, 100, 370, 120, 4, "#FFEC21")
            draMoveLineBotLeft(moveCount3, 410, 155, 390, 175, 4, "#FFEC21")
            draMoveLineTop(moveCount4, 410, 155, 435, 130, 4, "#FFEC21")
            draMoveLineBotRight(moveCount5, 350, 215, 370, 235, 4, "#FFEC21")   
            draMoveLineBotRight(moveCount6, 465, 100, 485, 120, 4, "#FFEC21")
            draMoveLineTop(moveCount7, 476, 342, 496, 322, 4, "#FFEC21")
            draMoveLineBotLeft(moveCount7, 592, 228, 572, 248, 4, "#FFEC21")
            draMoveLineBotRight(moveCount8, 532, 287, 552, 307, 4, "#FFEC21")
            draMoveLineTop(moveCount9, 591, 345, 610, 327, 4, "#FFEC21")

        }, 100)   

        

        function drawStatic(){   // 畫靜態圖 藍色背景線
            ctx.fillRect(0, 0, 1500, 500)
            ctx.fillStyle = "#eee"

            // 畫藍色背景線 由9條線段組成 所以調用了9次

            drawLine(197, 247, 350, 100, 2, "#006EC3")
            drawLine(350, 100, 408, 157, 2, "#006EC3")
            drawLine(410, 155, 350, 215, 2, "#006EC3")
            drawLine(350, 215, 477, 342, 2, "#006EC3")
            drawLine(410, 155, 465, 100, 2, "#006EC3")
            drawLine(465, 100, 593, 228, 2, "#006EC3")
            drawLine(476, 342, 592, 228, 2, "#006EC3")
            drawLine(532, 287, 590, 345, 2, "#006EC3")
            drawLine(590, 345, 740, 200, 2, "#006EC3")

        }
  
          // cVar 移動次數  sW 起始點X軸坐標  sH 起始點Y軸坐標  eW 端點X軸坐標   eH 端點Y軸坐標 lW 線寬  color 線的顏色

        function draMoveLineTop(cVar,sW, sH, eW, eH, lW, color ){   // 畫斜向上用於移動的線
            
            drawLine(cVar*5+sW, sH-cVar*5, cVar*5+eW, eH-cVar*5, lW, color)
        }

        function draMoveLineBotRight(cVar,sW, sH, eW, eH, lW, color ){   // 畫斜向下用於移動的線
            
            drawLine(cVar*5+sW, sH+cVar*5, cVar*5+eW, eH+cVar*5, lW, color)
        }

        function draMoveLineBotLeft(cVar,sW, sH, eW, eH, lW, color ){   // 畫斜向下用於移動的線
            
            drawLine(sW-cVar*5, sH+cVar*5, eW-cVar*5, eH+cVar*5, lW, color)
        }




        function drawLine(sW, sH, eW, eH, lW, color) { // 畫線函數
            ctx.beginPath()
            ctx.moveTo(sW,sH);
            ctx.lineTo(eW,eH);
            ctx.lineWidth = lW
            ctx.strokeStyle = color
            ctx.stroke();
            ctx.closePath()
        }

        
             
    </script>
</body>    
</html>

 

17:04:20 2021-06-18


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM