Canvas学习笔记(一)线条和圆弧

1 篇文章 0 订阅
0 篇文章 0 订阅

canvas是HTML5中新增的一个重要元素,专门用来绘制图形,在页面上放置一个canvas元素,就相当于在页面上放置了一块“画布”,可以在其中进行图形的绘制。

<canvas id="canvas" width="1024" height="768"></canvas>

默认情况下该矩形区域宽为300像素,高为150像素,可以通过width和height属性来自定义”画布”的大小,
还可以给canvas元素设置css样式,如下所示:

#canvas {
    border: 1px solid #aaaaaa;
    display: block;
    margin: 50px auto;
}

这里写图片描述
在页面上放置了canvas元素后,便可以通过javascript在其中进行绘制了
首先通过引用canvas元素的id来获取对canvas对象的访问权,接着调用canvas对象的getContext()方法获取
用于在画布上绘图的上下文对象,参数“2d”指定了您想要在画布上绘制的类型。当前唯一的合法值是 “2d”,它指定了二维绘图

var canvas = document.getElementById("canvas");
canvas.width = 1024;                            //也可以这样来设定canvas元素的尺寸
canvas.height = 768;
var context = canvas.getContext("2d"); 

使用canvas绘制一个三角形

//以画布左上角为原点,向右为x轴,向下为y轴
context.moveTo(100, 100);   //不进行绘制,只是将当前位置移动到指定的(x, y)坐标处
context.lineTo(700, 700);   //从起始点到(700, 700)画一条线段
context.lineTo(100, 700);   //在上一个点的基础上连接(100, 700)
context.lineTo(100, 100);   //同上,这里又回到了起始点
context.stroke();           //绘制线条

这里写图片描述

给三角形设置线宽、线条颜色和填充颜色

context.moveTo(100, 100);
context.lineTo(700, 700);
context.lineTo(100, 700);
context.lineTo(100, 100);
context.lineWidth = 3;              //定义线条宽度,单位像素
context.strokeStyle = "#005588";    //定义线条颜色
context.stroke();                   //绘制线条
context.fillStyle = "#458b00";      //定义填充颜色, 支持"rgb(r, g, b)"方式,默认为黑色
context.fill();                     //进行填充

这里写图片描述

绘制多个线段

context.moveTo(100, 100);
context.lineTo(700, 700);
context.lineTo(100, 700);
context.lineTo(100, 100);
context.lineWidth = 3;              //定义线条宽度,单位像素
context.strokeStyle = "#005588";    //定义线条颜色
context.stroke();                   //绘制线条
context.fillStyle = "#458b00";      //定义填充颜色
context.fill();                     //进行填充


context.moveTo(200, 100);           //第二条线段
context.lineTo(700, 600);
context.stroke();

可以发现第二条线段的颜色和三角形线条的颜色和线宽是一样的
这里写图片描述
如果给第二条线段设置了颜色

context.moveTo(100, 100);
context.lineTo(700, 700);
context.lineTo(100, 700);
context.lineTo(100, 100);
context.lineWidth = 3;              //定义线条宽度,单位像素
context.strokeStyle = "#005588";    //定义线条颜色
context.stroke();                   //绘制线条
context.fillStyle = "#458b00";      //定义填充颜色
context.fill();                     //进行填充

context.moveTo(200, 100);
context.lineTo(700, 600);
context.strokeStyle = "#ff6600";    //这次设置了颜色
context.stroke();

所有的线条颜色都变成了最后设置了#ff6600了,这是因为canvas的绘制是基于状态的,在绘制三角形调用stroke()方法之前,一个状态已经设定了,所以一开始是基于前6行代码设置的状态进行绘制的,但是当绘制第二个线段时,又重新设置了线条颜色为#ff6600,所以最后呈现出的结果就是所有线条都变成了#ff6600颜色

这里写图片描述
如果想要单独的绘制一个线条应该这么做:

context.beginPath();                //开始绘制一个路径
context.moveTo(100, 100);
context.lineTo(700, 700);
context.lineTo(100, 700);
context.lineTo(100, 100);
context.closePath();                //关闭路径,如果路径不封闭,会自动将首尾连接起来
context.lineWidth = 5;              //定义线条宽度,单位像素
context.strokeStyle = "#005588";    //定义线条颜色

context.stroke();                   //绘制线条
context.fillStyle = "#458b00";      //定义填充颜色
context.fill();                     //进行填充
context.beginPath();
context.moveTo(200, 100);
context.lineTo(700, 600);
context.closePath();
context.strokeStyle = "#ff6600";    //如果不指定颜色,将会继承之前的颜色
context.stroke();

beginPath()用于开始路径的创建。
closePath()则是关闭路径,路径的创建工作完成了,但是需要注意的是,这时只是路径创建完毕而已,还没有真正绘制图形,也就是说对于线条的绘制仍然要调用stroke()方法,对于图形的填充,仍然要调用fill()方法
如果没有给第二条线段指定线宽和颜色,将会继承上一个状态的线宽和颜色
这里写图片描述

绘制圆弧,非常简单的一个方法

/*
    context.arc(
        centerx, centery, radius,   圆心坐标,半径
        startingAngle, endingAngle, 开始和结束角度
        anticlockwise = false       是否以逆时针方向绘制,默认为false     
    )
*/

注意:对于canvas中的圆弧,角度都是固定的,如下所示
这里写图片描述

可能用代码描述比较清晰

window.onload = function() {
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    canvas.width = 600;
    canvas.height = 600;
    if(context) {
        //以(300, 300)为圆心,300为半径,顺时针从0度到0.5PI绘制一条圆弧
        context.arc(300, 300, 300, 0, 0.5*Math.PI, false);
        context.strokeStyle = "#005588";
        context.lineWidth = 3;
        context.stroke();
    }else {
        alert("当前浏览器不支持canvas")
    }
}

这里写图片描述

如果改变绘制方向

window.onload = function() {
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    canvas.width = 600;
    canvas.height = 600;
    if(context) {
        //以(300, 300)为圆心,300为半径,逆时针从0度到0.5PI绘制一条圆弧
        context.arc(300, 300, 300, 0, 0.5*Math.PI, true);
        context.strokeStyle = "#005588";
        context.lineWidth = 3;
        context.stroke();
    }else {
        alert("当前浏览器不支持canvas")
    }
}

所以说明了不管是顺时针还是逆时针,角度都是固定不变的,另外如果想要绘制一个圆,只需要把0.5*Math.PI改为2*Math.PI即可
这里写图片描述

使用以上知识绘制一个七巧板

//tangram数组定义七巧板内每一个图形的坐标和颜色
    var tangram = [
        {p:[{x:0, y:0}, {x:800, y:0}, {x:400, y:400}], color:"#caff67"},
        {p:[{x:0, y:0}, {x:400, y:400}, {x:0, y:800}], color:"#67becf"},
        {p:[{x:800, y:0}, {x:800, y:400}, {x:600, y:600}, {x:600, y:200}], color:"#ef3d61"},
        {p:[{x:600, y:200}, {x:600, y:600}, {x:400, y:400}], color:"#f9f51a"},
        {p:[{x:400, y:400}, {x:600, y:600}, {x:400, y:800}, {x:200, y:600}], color:"#a594c0"},
        {p:[{x:200, y:600}, {x:400, y:800}, {x:0, y:800}], color:"#fa8ece"},
        {p:[{x:800, y:400}, {x:800, y:800}, {x:400, y:800}], color:"#f6ca29"},
    ];
    window.onload = function() {
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 800;
        var context = canvas.getContext("2d");

        if(context) {

            //遍历tangram数组绘制七巧板
            for(var i = 0 ; i < tangram.length ; ++i) {
                //调用draw()方法单独绘制一个图形
                draw(tangram[i], context);
            }

            function draw(param, ctx) {
                ctx.beginPath();
                //将"画笔"移动到起始点
                ctx.moveTo(param.p[0].x, param.p[0].y);
                //连接一个图形的所有坐标
                for(var i = 1 ; i < param.p.length ; ++i) {
                    ctx.lineTo(param.p[i].x, param.p[i].y);
                }
                ctx.closePath();
                //填充颜色
                ctx.fillStyle = param.color;
                ctx.fill();
                ctx.lineWidth = 3;
                ctx.stroke();
            }
        }else {
            alert("当前浏览器不支持canvas");
        }
    }

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Canvas红包雨是一种基于HTML5 Canvas技术开发的节日效果,通过JavaScript控制红包的下落和动画效果,实现一个红包雨的动态效果。 下面是Canvas红包雨的开发流程: 1. HTML页面中添加Canvas画布,并设置画布的宽高和样式。 ```html <canvas id="canvas"></canvas> ``` ```css #canvas { width: 100%; height: 100%; position: absolute; top: 0; left: 0; z-index: 999; } ``` 2. 在JavaScript中获取Canvas画布对象,并设置画布的宽高。 ```javascript var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; ``` 3. 定义红包对象,包括红包的位置、速度、大小和颜色等属性。 ```javascript function RedPacket(x, y, vx, vy, size, color) { this.x = x; this.y = y; this.vx = vx; this.vy = vy; this.size = size; this.color = color; } ``` 4. 在Canvas画布上绘制红包,并实现红包的下落和动画效果。 ```javascript var redPackets = []; // 存储红包对象的数组 function drawRedPacket(redPacket) { ctx.beginPath(); ctx.arc(redPacket.x, redPacket.y, redPacket.size, 0, 2 * Math.PI); ctx.fillStyle = redPacket.color; ctx.fill(); } function updateRedPacket(redPacket) { redPacket.x += redPacket.vx; redPacket.y += redPacket.vy; redPacket.vy += gravity; } function animate() { ctx.clearRect(0, 0, canvas.width, canvas.height); for (var i = 0; i < redPackets.length; i++) { drawRedPacket(redPackets[i]); updateRedPacket(redPackets[i]); } requestAnimationFrame(animate); } requestAnimationFrame(animate); ``` 5. 实现红包的自动生成和动态效果,可以通过setInterval或setTimeout定时调用生成红包的函数。 ```javascript function createRedPacket() { var x = Math.random() * canvas.width; var y = -20; var vx = Math.random() * 6 - 3; var vy = Math.random() * 2 + 2; var size = Math.random() * 10 + 10; var color = '#' + Math.floor(Math.random() * 16777215).toString(16); // 随机生成颜色 var redPacket = new RedPacket(x, y, vx, vy, size, color); redPackets.push(redPacket); } setInterval(createRedPacket, 500); // 每500ms生成一个红包 ``` 6. 实现红包的点击事件,当用户点击红包时,可以实现红包爆炸效果,并显示红包金额或祝福语。 ```javascript function explodeRedPacket(redPacket) { var particles = []; // 存储爆炸粒子的数组 for (var i = 0; i < 20; i++) { var particle = { x: redPacket.x, y: redPacket.y, vx: Math.random() * 6 - 3, vy: Math.random() * 6 - 3, size: Math.random() * 3 + 1, color: redPacket.color }; particles.push(particle); } for (var i = 0; i < particles.length; i++) { drawRedPacket(particles[i]); } } canvas.addEventListener('click', function(event) { var x = event.clientX; var y = event.clientY; for (var i = 0; i < redPackets.length; i++) { var redPacket = redPackets[i]; if (x > redPacket.x - redPacket.size && x < redPacket.x + redPacket.size && y > redPacket.y - redPacket.size && y < redPacket.y + redPacket.size) { explodeRedPacket(redPacket); redPackets.splice(i, 1); break; } } }); ``` 上述就是Canvas红包雨的开发流程,通过Canvas技术和JavaScript实现红包的下落、动画、自动生成和点击事件等效果,可以增加网站的趣味性和用户互动性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值