老师能不能讲一下这一段

来源: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

同学你好,老师大概给你讲一下该段逻辑:

如下代码,是用来绘制口号:

http://img.mukewang.com/climg/5f45d03c09af42ff12180235.jpg

其中measureText方法,是用来计算口号文本的宽度;而maxWidth是“请输入姓名、请输入地址、请输入职业”这几个文本宽度,最大的那个值。而offset是计算出来的口号中心的偏移位置。“115 + maxWidth + offset”就是绘制口号时的x方向位置。

如下代码,是用来绘制曲线:

http://img.mukewang.com/climg/5f45d04b09417a2016030297.jpg

其中,大多数api都是canvas绘图的api,同学看下笔记,复习一下。特殊的就是quadraticCurveTo是用来绘制曲线,它的四个参数,对应两个点坐标,前两个参数是曲线开始点的x、y坐标,后两个参数是曲线结束点的x、y坐标。同学使用老师设置的这两个点即可,该方法不常用。

如下代码是在离屏canvas上绘制固定的一些图画:

http://img.mukewang.com/climg/5f45d0600985edcb06960133.jpg

然后下面的setInterval定时器,则是将固定的画面(离屏canvas上的内容)与动态的小点,结合起来绘制到animCtx上。animCanvas才是我们看到的那个canvas。

其中绘制下落的圆形,思路就是,在定时器中,动态的改变某个圆形的y坐标,连续起来,就会形成,圆形下落的动画效果。如下:

http://img.mukewang.com/climg/5f45d07709cc1b8409660552.jpghttp://img.mukewang.com/climg/5f45d07b092f513b10010637.jpg

所以“!circles[i]”就是判断该圆有没有运动完成。而circles是数组,是因为它里面要保存11个圆的数据(for(var i=0; i<=10; i++) {})。

同学再看一下。

如果我的回答帮到了你,欢迎采纳,祝学习愉快!

0

0 学习 · 6815 问题

查看课程