1. 程式人生 > >canvas arc() 方法繪製弧線、曲線、圓形

canvas arc() 方法繪製弧線、曲線、圓形

canvas arc() 方法

arc() 方法建立弧/曲線(用於建立圓或部分圓),更多可參考《HTML 5 Canvas 繪製圖形影象

提示1:如需通過 arc() 來建立圓,請把起始角設定為 0,結束角設定為 2*Math.PI。

提示2:請使用 stroke() 或 fill() 方法在畫布上繪製實際的弧。stroke 方法用於繪製路徑,fill 方法用於填充路徑。

弧/曲線

JavaScript 語法:context.arc(x,y,r,sAngle,eAngle,counterclockwise);

引數 描述
x 圓的中心的 x 座標。
y 圓的中心的 y 座標。
r 圓的半徑。
sAngle 起始角,以弧度計。(弧的圓形的三點鐘位置是 0 度)。
eAngle 結束角,以弧度計。
counterclockwise 可選。規定應該逆時針還是順時針繪圖。False = 順時針(預設),true = 逆時針。

編碼示例

繪製圓形

實現程式碼如下:

<!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">
        .divContent {
            display: inline-block;
            width: 200px;
            height: 200px;
            background-color: #333333;
            margin-left: 200px;
        }
    </style>

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

    <script type="module">
        /**畫第一個圓形----非動畫版
         * */
        let drawArc1 = function () {
            /**獲取畫布*/
            let canvas = document.getElementById("myCanvas");
            /**
             * 動態設定畫布的寬、高。注意 Canvas 的 width、height的值只能是純數字,不能帶單位
             * 如下所示,讓畫布填充父元素
             * @type {void|string|XML|*|jQuery}
             */
            canvas.width = $(".divContent").css("width").replace("px", "");
            canvas.height = $(".divContent").css("height").replace("px", "");

            /**獲取畫布上下文*/
            let ctx = canvas.getContext("2d");
            /**1)設定畫筆顏色,不設定時預設為黑色
             * strokeStyle 屬性設定或返回畫筆的顏色、漸變或模式*/
            ctx.strokeStyle = "#fff";

            /**2)開始一條新路徑
             * beginPath() 方法開始一條路徑,或重置當前的路徑*/
            ctx.beginPath();

            /**3)建立弧線/曲線
             * 圓心的位置為畫布的中心,圓形半徑為 50 畫素(不能帶單位)
             * 起始角度為 0,即 x 軸的正方向,結束角度為 360度*/
            ctx.arc(canvas.width / 2, canvas.height / 2, 50, 0, 2 * Math.PI);

            /**4)繪製定義好的路徑
             * stroke() 方法實際地繪製路徑*/
            ctx.stroke();
        }

        /**畫第二個圓—————動畫版
         * eAngle:圓形結束的角度,會動態變化達到動畫的效果
         * canvas:畫布,作為引數傳入,避免每次重複獲取
         * ctx:畫布上下文,作為引數傳入,避免每次重複獲取
         */
        let eAngle = 0;
        let drawArc2 = function (canvas, ctx) {
            /**
             * 動態設定畫布的寬、高。注意 Canvas 的 width、height的值只能是純數字,不能帶單位
             * 如下所示,讓畫布填充父元素
             *
             * 為畫布設定寬(width)與高(height),它會先清除整個畫布內所有的舊畫素
             * 相當於呼叫 context.clearRect(0,0,canvas.width,canvas.height); 方法
             * 如果每次需要重新渲染,則需要清除舊畫素;如果是疊加繪圖,則不需要清除舊畫素
             * */            

            canvas.width = $(".divContent").css("width").replace("px", "");
            canvas.height = $(".divContent").css("height").replace("px", "");

            /**1)設定畫筆顏色,不設定時預設為黑色
             * strokeStyle 屬性設定或返回畫筆的顏色、漸變或模式*/
            ctx.strokeStyle = "#fff";

            /**2)開始一條新路徑
             * beginPath() 方法開始一條路徑,或重置當前的路徑*/
            ctx.beginPath();

            /**3)建立弧線/曲線
             * true 表示逆時針繪製,false 或者不寫為順時針*/
            ctx.arc(canvas.width / 2, canvas.height / 2, 50, 0, eAngle, true);

            /**4)繪製定義好的路徑
             * stroke() 方法實際地繪製路徑*/
            ctx.stroke();

            /**
             * 將結束角度 + 0.1,然後如果已經達到 360度,則歸零
             * 使用 requestAnimationFrame 實現幀動畫,每秒約 60 次的迴圈回撥 drawArc2 方法
             * @type {number}
             */
            eAngle = eAngle + 0.1;
            if (eAngle >= 2 * Math.PI) {
                eAngle = 0;
            }

            /**幀動畫回撥*/
            requestAnimationFrame(function () {
                drawArc2(canvas, ctx);
            });
        }

        $(function () {
            drawArc1();

            /**獲取畫布*/
            const canvas = document.getElementById("myCanvas2");
            /**獲取畫布上下文*/
            const ctx = canvas.getContext("2d");
            drawArc2(canvas, ctx);
        });

    </script>

</head>
<body>
<div class="divContent">
    <canvas id="myCanvas">
        瀏覽器不支援 Canvas
    </canvas>
</div>

<div class="divContent">
    <canvas id="myCanvas2">
        瀏覽器不支援 Canvas
    </canvas>
</div>

</body>
</html>

對 requestAnimationFrame 不熟悉的,可以檢視《 requestAnimationFrame()方法實現幀動畫

填充圓形

區別在於:

strokeStyle 屬性用於設定或返回畫筆的顏色、漸變或模式

stroke()    繪製已定義的路徑

fillStyle 屬性用於設定或返回用於填充繪畫的顏色、漸變或模式

fill()  屬性用於填充當前繪圖(路徑)

<!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">
        .divContent {
            display: inline-block;
            width: 200px;
            height: 200px;
            background-color: #333333;
            margin-left: 200px;
        }
    </style>

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

    <script type="module">

        /**畫第一個圓形----非動畫版
         */
        let drawArc1 = function () {
            /**獲取畫布*/
            let canvas = document.getElementById("myCanvas");
            /**
             * 動態設定畫布的寬、高。注意 Canvas 的 width、height的值只能是純數字,不能帶單位
             * 如下所示,讓畫布填充父元素
             * @type {void|string|XML|*|jQuery}
             */
            canvas.width = $(".divContent").css("width").replace("px", "");
            canvas.height = $(".divContent").css("height").replace("px", "");

            /**獲取畫布上下文*/
            let ctx = canvas.getContext("2d");

            /**1)設定路徑將要填充的顏色
             * fillStyle 屬性設定或返回用於填充繪畫的顏色、漸變或模式*/
            ctx.fillStyle = "#f00";

            /**2)開始一條新路徑
             * beginPath() 方法開始一條路徑,或重置當前的路徑*/
            ctx.beginPath();

            /**3)建立弧線/曲線
             * 圓心的位置為畫布的中心,圓形半徑為 50 畫素(不能帶單位)
             * 起始角度為 0,即 x 軸的正方向,結束角度為 360度*/
            ctx.arc(canvas.width / 2, canvas.height / 2, 50, 0, 2 * Math.PI);

            /**4)繪製定義好的路徑
             * fill() 方法填充當前的影象(路徑),預設顏色是黑色。*/
            ctx.fill();
        }

        /**畫第二個圓—————動畫版
         * eAngle:圓形結束的角度,會動態變化達到動畫的效果
         * canvas:畫布,作為引數傳入,避免每次重複獲取
         * ctx:畫布上下文,作為引數傳入,避免每次重複獲取
         */
        let eAngle = 0;
        let drawArc2 = function (canvas, ctx) {
            /**
             * 動態設定畫布的寬、高。注意 Canvas 的 width、height的值只能是純數字,不能帶單位
             * 如下所示,讓畫布填充父元素
             *
             * 為畫布設定寬(width)與高(height),它會先清除整個畫布內所有的舊畫素
             * 相當於呼叫 context.clearRect(0,0,canvas.width,canvas.height); 方法
             * 如果每次需要重新渲染,則需要清除舊畫素;如果是疊加繪圖,則不需要清除舊畫素
             * */
            canvas.width = $(".divContent").css("width").replace("px", "");
            canvas.height = $(".divContent").css("height").replace("px", "");

            /**1)設定路徑將要填充的顏色
             * fillStyle 屬性設定或返回用於填充繪畫的顏色、漸變或模式*/
            ctx.fillStyle = "#f00";

            /**2)開始一條新路徑
             * beginPath() 方法開始一條路徑,或重置當前的路徑*/
            ctx.beginPath();

            /**3)建立弧線/曲線
             * true 表示逆時針繪製,false 或者不寫為順時針*/
            ctx.arc(canvas.width / 2, canvas.height / 2, 50, 0, eAngle, true);

            /**4)繪製定義好的路徑
             * fill() 方法填充當前的影象(路徑),預設顏色是黑色。*/
            ctx.fill();

            /**
             * 將結束角度 + 0.1,然後如果已經達到 360度,則歸零
             * 使用 requestAnimationFrame 實現幀動畫,每秒約 60 次的迴圈回撥 drawArc2 方法
             * @type {number}
             */
            eAngle = eAngle + 0.1;
            if (eAngle >= 2 * Math.PI) {
                eAngle = 0;
            }
            requestAnimationFrame(function () {
                drawArc2(canvas, ctx);
            });
        }

        $(function () {
            drawArc1();
            
            /**獲取畫布*/
            const canvas = document.getElementById("myCanvas2");
            /**獲取畫布上下文*/
            const ctx = canvas.getContext("2d");
            drawArc2(canvas, ctx);
        });
    </script>

</head>
<body>
<div class="divContent">
    <canvas id="myCanvas">
        瀏覽器不支援 Canvas
    </canvas>
</div>

<div class="divContent">
    <canvas id="myCanvas2">
        瀏覽器不支援 Canvas
    </canvas>
</div>

</body>
</html>