老师能不能讲一下这一段
来源:9-3 完成案例动画部分
qq_慕瓜7049344
2020-08-26 00:29:43
// 计算口号位置
var solganWidth;
solganWidth = cardCtx.measureText(slogan).width;
var offset = (cardCtx.canvas. width- 115 - maxWidth - solganWidth) / 2;
cardCtx.fillText(slogan, 115 + maxWidth + offset, 50);
// 画曲线
cardCtx.beginPath();
cardCtx.moveTo(115 + maxWidth + offset, 70);
cardCtx.quadraticCurveTo(115 + maxWidth + offset, 50, 115 + solganWidth + maxWidth + offset, 60);
cardCtx.strokeStyle = "#ddd";
cardCtx.stroke();
cardCtx.restore();
}
// 触发click事件
generateBtn.click();
// 创建和设置animCanvas,该canvas才是真正的显示
var animCanvas = document.getElementById('animCanvas');
var animCtx = animCanvas.getContext('2d');
animCtx.canvas.width = 600;
animCtx.canvas.height = 100;
var circles = [];
setInterval(function() {
// 擦出画布
animCtx.clearRect(0, 0, animCtx.canvas.width, animCtx.canvas.height);
// 把离屏canvas的内容画进来
animCtx.drawImage(cardCanvas, 0, 0, animCtx.canvas.width, animCtx.canvas.height,
0, 0, cardCtx.canvas.width, cardCtx.canvas.height);
// 绘制下落的圆形
for(var i=0; i<=10; i++) {
if(!circles[i]) { //为什么这里要取反 还有这里为什么要设置成数组呢 数组里面是空的呢
circles[i] = {};
circles[i].radius = Math.floor(Math.random() * 5) + 1;
circles[i].y = - circles[i].radius - Math.floor(Math.random() * 10);
circles[i].x = i * 60 + Math.floor(Math.random() * 10) - 5;
circles[i].vy = Math.floor(Math.random() * 5) + 1;
}
animCtx.beginPath();
animCtx.arc(circles[i].x, circles[i].y, circles[i].radius, 0, Math.PI * 2);
animCtx.fillStyle = "rgba(255, 255, 255, 0.5)";
animCtx.fill();
circles[i].y = circles[i].y + circles[i].vy;
if(circles[i].y > animCtx.canvas.height + circles[i].radius * 2) {
circles[i] = undefined;
}
}
}, 100);
1回答
好帮手慕久久
2020-08-26
同学你好,老师大概给你讲一下该段逻辑:
如下代码,是用来绘制口号:
其中measureText方法,是用来计算口号文本的宽度;而maxWidth是“请输入姓名、请输入地址、请输入职业”这几个文本宽度,最大的那个值。而offset是计算出来的口号中心的偏移位置。“115 + maxWidth + offset”就是绘制口号时的x方向位置。
如下代码,是用来绘制曲线:
其中,大多数api都是canvas绘图的api,同学看下笔记,复习一下。特殊的就是quadraticCurveTo是用来绘制曲线,它的四个参数,对应两个点坐标,前两个参数是曲线开始点的x、y坐标,后两个参数是曲线结束点的x、y坐标。同学使用老师设置的这两个点即可,该方法不常用。
如下代码是在离屏canvas上绘制固定的一些图画:
然后下面的setInterval定时器,则是将固定的画面(离屏canvas上的内容)与动态的小点,结合起来绘制到animCtx上。animCanvas才是我们看到的那个canvas。
其中绘制下落的圆形,思路就是,在定时器中,动态的改变某个圆形的y坐标,连续起来,就会形成,圆形下落的动画效果。如下:
所以“!circles[i]”就是判断该圆有没有运动完成。而circles是数组,是因为它里面要保存11个圆的数据(for(var i=0; i<=10; i++) {})。
同学再看一下。
如果我的回答帮到了你,欢迎采纳,祝学习愉快!
相似问题
回答 2