canvas arc() 方法绘制弧线、曲线、圆形,rect() 绘制矩形

目录

canvas arc() 方法

绘制圆形

填充圆形

canvas rect() 绘制矩形


注意:canvas 的 width 与 height 属性的值不能带单位,如 100px、100% 都是错误的,只能是纯数字,单位默认为 px。

canvas arc() 方法

1、arc() 方法创建弧/曲线(用于创建圆或部分圆),更多可参考《HTML 5 Canvas 绘制图形图像

2、提示1:如需通过 arc() 来创建圆,请把起始角设置为 0,结束角设置为 2*Math.PI。

3、提示2:请使用 stroke() 或 fill() 方法在画布上绘制实际的弧。stroke 方法用于绘制路径,fill 方法用于填充路径。

弧/曲线

4、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>

canvas rect() 绘制矩形

rect() 方法用于创建矩形。

提示:请使用 stroke() 在画布上实际绘制矩形,或使用 fill() 方法在画布上实际地填充矩形。

JavaScript 语法:context.rect(x,y,width,height);

参数描述
x矩形左上角的 x 坐标
y矩形左上角的 y 坐标
width矩形的宽度,以像素计,所以不需要,也不能再带单位
height矩形的高度,以像素计,所以不需要,也不能再带单位

实现代码如下:

<!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: 300px;
            height: 300px;
            background-color: #333333;
            margin-left: 100px;
        }
    </style>
    <!-- JQuery CDN-->
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="module">
        /**画第一个九宫格矩形
         * canvas:画布在整个过程中是不变的,所以作为参数传入,避免重复获取
         * ctx:画布上下文
         */
        let drawRect1 = function (canvas, ctx) {
            /**矩形绘制的颜色*/
            let colorArrays = [
                "#FFCC66", "#CC00FF", "#996633",
                "#3366CC", "#330000", "#FFFF66",
                "#000099", "#FF3300", "#007700"
            ];
            /**每个单元格矩形的颜色索引*/
            let index = 0;
            for (let i = 0; i < 3; i++) {
                for (let j = 0; j < 3; j++) {
                    /**其它的内容都是辅助,真正绘制矩形的核心代码就是下面 3 步*/
                    /**1)beginPath() 方法开始一条路径,或重置当前的路径。比如 矩形、圆形等*/
                    ctx.beginPath();

                    /**2)lineWidth 属性设置或返回当前线条的宽度,以像素计,不能再带单位。
                     * strokeStyle:设置画笔当前的颜色
                     * */
                    ctx.lineWidth = "2";
                    ctx.strokeStyle = colorArrays[index++];
                    /**3)rect() 方法创建矩形,起点坐标动态改变,长宽为画布的三分之一
                     *      这样的就是一个九宫格,而且随着画布尺寸的变化而变化
                     * stroke() 实际绘制已定义的路径*/
                    ctx.rect(j * canvas.width / 3,
                        i * canvas.height / 3,
                        canvas.width / 3,
                        canvas.height);
                    ctx.stroke();

                }
            }
        };

        /**画第一个九宫格矩形
         * canvas:画布在整个过程中是不变的,所以作为参数传入,避免重复获取
         * ctx:画布上下文
         */
        let drawRect2 = function (canvas, ctx) {
            /**矩形绘制的颜色*/
            let colorArrays = [
                "#FFCC66", "#CC00FF", "#996633",
                "#3366CC", "#330000", "#FFFF66",
                "#000099", "#FF3300", "#007700"
            ];
            /**这里用于随机切换一下两个单元格的颜色*/
            let x = 0, y = 0;
            while (x == y) {
                x = Math.round(Math.random() * 8);
                y = Math.round(Math.random() * 8);
            }
            let temp = colorArrays[x];
            colorArrays[x] = colorArrays[y];
            colorArrays[y] = temp;

            let index = 0;
            for (let i = 0; i < 3; i++) {
                for (let j = 0; j < 3; j++) {
                    /**其它的内容都是辅助,真正绘制矩形的核心代码就是下面 3 步*/
                    /**1)beginPath() 方法开始一条路径,或重置当前的路径。比如 矩形、圆形等*/
                    ctx.beginPath();
                    /**2)lineWidth 属性设置或返回当前线条的宽度,以像素计,不能再带单位。
                     * strokeStyle:设置画笔当前的颜色
                     * */
                    ctx.lineWidth = "2";
                    ctx.fillStyle = colorArrays[index++];
                    /**3)rect() 方法创建矩形,起点坐标动态改变,长宽为画布的三分之一
                     *      这样的就是一个九宫格,而且随着画布尺寸的变化而变化
                     * stroke() 实际绘制已定义的路径*/
                    ctx.rect(j * canvas.width / 3,
                        i * canvas.height / 3,
                        canvas.width / 3,
                        canvas.height);
                    ctx.fill();
                }
            }
            setTimeout(function () {
                drawRect2(canvas, ctx);
            }, 1000);
        };

        $(function () {
            /**获取第一张画布*/
            let canvas1 = document.getElementById("myCanvas1");
            /**为画布设置宽(width)与高(height),它会先清除整个画布内所有的旧像素
             * 相当于调用 context.clearRect(0,0,canvas.width,canvas.height); 方法
             * 如果每次需要重新渲染,则需要清除旧像素;如果是叠加绘图,则不需要清除旧像素
             * */
            canvas1.width = $(".divContent").css("width").replace("px", "");
            canvas1.height = $(".divContent").css("height").replace("px", "");
            /**获取画布上下文*/
            let ctx1 = canvas1.getContext("2d");
            drawRect1(canvas1, ctx1);
            /**获取第二张画布*/
            let canvas2 = document.getElementById("myCanvas2");
            canvas2.width = $(".divContent").css("width").replace("px", "");
            canvas2.height = $(".divContent").css("height").replace("px", "");
            /**获取画布上下文*/
            let ctx2 = canvas2.getContext("2d");
            drawRect2(canvas2, ctx2);
        });
    </script>
</head>
<body>
<div class="divContent">
    <canvas id="myCanvas1">
        浏览器不支持 Canvas
    </canvas>
</div>
<div class="divContent">
    <canvas id="myCanvas2">
        浏览器不支持 Canvas
    </canvas>
</div>
</body>
</html>

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚩尤后裔-汪茂雄

芝兰生于深林,不以无人而不芳。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值