1. 程式人生 > >Canvas beginPath()、moveTo()、 lineTo() 、stroke() 繪製直線路徑

Canvas beginPath()、moveTo()、 lineTo() 、stroke() 繪製直線路徑

目錄

beginPath() 方法

moveTo() 方法

lineTo() 方法

stroke() 方法

編碼示例

極速梯子


beginPath() 方法

beginPath() 方法開始一條路徑,或重置當前的路徑。

提示:請使用這些方法來建立路徑:moveTo()、lineTo()、quadricCurveTo()、bezierCurveTo()、arcTo() 以及 arc()。

提示:請使用 stroke() 方法在畫布上繪製確切的路徑

JavaScript 語法:context.beginPath();

w3c 參考例子:http://www.w3school.com.cn/tags/canvas_beginpath.asp

moveTo() 方法

moveTo() 方法把路徑移動到畫布中的指定點,不建立線條。

提示:請使用 stroke() 方法在畫布上繪製確切的路徑。

JavaScript 語法:context.moveTo(x,y);

引數 描述
x 路徑的目標位置的 x 座標。
y 路徑的目標位置的 y 座標。

w3c 參考例子:

http://www.w3school.com.cn/tags/canvas_moveto.asp

lineTo() 方法

lineTo() 方法新增一個新點,然後建立從該點到畫布中最後指定點的線條(該方法並不會建立線條)。

提示:請使用 stroke() 方法在畫布上繪製確切的路徑。

JavaScript 語法:context.lineTo(x,y);

引數 描述
x 路徑的目標位置的 x 座標。
y 路徑的目標位置的 y 座標。

菜鳥教程:http://www.runoob.com/tags/canvas-lineto.html

stroke() 方法

stroke() 方法會實際地繪製出通過 moveTo() 和 lineTo() 方法定義的路徑。預設顏色是黑色。

提示:請使用 strokeStyle 屬性來繪製另一種顏色/漸變。

JavaScript 語法:context.stroke();

菜鳥教程:http://www.runoob.com/tags/canvas-stroke.html

編碼示例

極速梯子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title></title>

    <style type="text/css">
        #myCanvas {
            border-left: 1px solid #9A9990;
            border-right: 1px solid #9A9990;
        }
    </style>

    <!-- JQuery CDN-->
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="text/javascript">

        /**以下設定為全域性變數
         * speed:速度,單位畫素
         * singleWidth:單次運動線長,與畫布等長
         * singleHeight:單次運動線高
         * lineNum:繪製的橫線數目
         * time:幀動畫請求id,用於停止動畫
         */
        let speed = 3;
        let singleWidth = 300, singleHeight = 40;
        let lineNum;
        let time = 0;

        /**
         * 極速梯子動畫
         * @param canvas :畫布
         * @param ctx :畫布上下文
         * @param currentWidth :動畫終端當前 x 座標
         * @param currentHeight :動畫終端當前 y 座標
         * @param flag :0 表示向下,-1 表示向左,1 表示向右
         * @param index : 向下移動的次數,從 1 開始
         */
        let show = function (canvas, ctx, currentWidth, currentHeight, flag, index) {
            switch (flag) {
            /** 向左移動*/
                case -1:
                    if (currentWidth > 0) {
                        currentWidth -= speed;
                    } else {
                        flag = 0;
                    }
                    break;
            /**向下移動*/
                case 0:
                    if (currentHeight < index * singleHeight) {
                        currentHeight += speed;
                    } else {
                        /**如果當前繪製了3條橫線,且一共只要繪製3條時,則繼續往下繪製一根*/
                        if (index == 4 && lineNum == 3) {
                            flag = 0;
                        } else {
                            flag = currentWidth <= 0 ? 1 : -1;
                        }
                        index++;
                    }
                    /**如果運動到底部距離5畫素,則停止動畫*/
                    if (currentHeight >= canvas.height - 5) {
                        return;
                    }
                    break;
            /**向右移動*/
                case 1:
                    if (currentWidth < singleWidth) {
                        currentWidth += speed;
                    } else {
                        flag = 0;
                    }
                    break;
            }
            /**新增一個新點,然後在畫布中建立從該點到最後指定點的線條(該方法並不會建立線條)
             * 最後繪製已定義的路徑*/
            ctx.lineTo(currentWidth, currentHeight);
            ctx.stroke();

            /**開啟幀動畫回撥*/
            time = requestAnimationFrame(function () {
                show(canvas, ctx, currentWidth, currentHeight, flag, index);
            });
        };

        $(function () {
            /**
             * 獲取畫布以及畫布上下文物件
             * @type {Element}
             */
            var canvas = document.getElementById("myCanvas");
            var ctx = canvas.getContext("2d");

            /**"執行"按鈕點選事件*/
            $("button").click(function () {
                /**先停止原來的幀動畫*/
                window.cancelAnimationFrame(time);

                /**情況畫布內的所有舊畫素點*/
                ctx.clearRect(0, 0, canvas.width, canvas.height);

                /**beginPath:開始一條路徑,或重置當前的路徑*/
                ctx.beginPath();
                /**
                 * lineWidth:設定或返回當前線條的寬度,以畫素計。
                 * lineCap:屬性設定或返回線條末端線帽的樣式。round 表示圓角
                 */
                ctx.lineWidth = 10;
                ctx.lineCap = "round";

                /**獲取使用者引數值*/
                var start = $("input[name='start']:checked").val();
                lineNum = $("input[name='lineNum']:checked").val();

                /**初始化起點 x 座標*/
                var initX = start == 1 ? 0 : 300;

                /**把路徑移動到畫布中的指定點,不建立線條,設定起點*/
                ctx.moveTo(initX, 0);
                /**呼叫方法實現動畫*/
                show(canvas, ctx, initX, 0, 0, 1);
            });
        });
    </script>
</head>
<body>
<canvas id="myCanvas" width="300" height="200">
    Your browser does not support the HTML5 canvas tag.
</canvas>
<br>
起點:<label><input type="radio" name="start" value="1" checked>左</label><label><input type="radio" name="start"
                                                                                    value="2">右</label><br>
線數:<label><input type="radio" name="lineNum" value="3" checked>3</label><label><input type="radio" name="lineNum"
                                                                                      value="4">4</label><br><br>
<button type="button">執行</button>
</body>
</html>