基于canvas使用粒子拼出你想要的文字[2]——粒子的动画效果

写在最前

本次分享一个用canvas粒子渲染文字的“完整”版实现,功能包括:随机粒子缓动动画,粒子汇聚、发散,并拼出你想要的文字。本文继续上面一节基于canvas使用粒子拼出你想要的文字的基础效果,完善了在文字拼接过程中的粒子效果。

欢迎关注我的博客,不定期更新中——

上节回顾

自上次的分享基于canvas使用粒子拼出你想要的文字,我们实现了一个可配置的用粒子拼出想要的文字效果,不过这个效果是静态的,就像这样:
image

这次我们试图对它进行了一些完善,让其可以尽量完整的实现我们的诉求。

效果图

惯例直接看下效果图:

2017-12-18 14_38_18

这是一个事先配置好的动画效果用来展示一下粒子的完整运动轨迹。在这个例子中我们做了以下几件事:
- 初始化一定数量的粒子,开始缓动
- 监听到输入事件后,拼出相应文字。其拼接的粒子是从缓动中的随机粒子抽取,如果不够则新加粒子
- 当再次监听到输入事件后,原文字散开到随机位置,新文字按照上一步进行绘制,以此往复

故本次我们讨论的重点则围绕缓动动画与粒子的汇聚与散开进行展开

整体逻辑

先来分析一下整体的实现思路

1、首先为了增加粒子的重用性,不需要每次拼新的文字都new一堆新的粒子。故选择维护了两个数组进行存放相应粒子。即随机缓动数组与展示效果数组

2、初始化一定数目粒子,粒子位置随机,半径随机,加入到随机粒子数组

3、对加入到随机粒子数组中的对象执行缓动动画

4、监听事件被触发,清空展示粒子数组,将当前页面所有粒子全部加入到随机粒子数组,同时更新粒子状态,让每个粒子重新出现在各个随机位置

5、当拼接文字开始,每次需要绘制一个粒子到拼接的地点时则从随机粒子数组中pop出一个粒子对象,更新粒子的位置等信息,push到展示粒子数组中,如果随机粒子数组数量不够,则新建对象添加到展示粒子数组。

6、展示粒子数组中的粒子收集完毕后,遍历数组依次渲染到指定位置

新的监听事件被触发重复以上的4、5、6步骤

实现核心

  • 随机粒子的缓动动画
  • 从随机粒子变为展示粒子的过程中,需要绘制出粒子的运动轨迹以实现发散与汇聚的效果
缓动动画

就像下面这样:

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我了解您的问题。您可以使用Vue3和Canvas API来创建一个粒子效果,以下是一些步骤: 1. 创建一个Canvas元素,并在Vue模板中引用它。 ``` <template> <canvas ref="canvas"></canvas> </template> ``` 2. 在Vue组件的mounted钩子中初始化Canvas上下文和一些变量。 ``` <script> export default { mounted() { const canvas = this.$refs.canvas; const ctx = canvas.getContext('2d'); const particles = []; const numParticles = 100; const width = canvas.width; const height = canvas.height; // ... } } </script> ``` 3. 创建一个Particle类来表示每个粒子,并在update方法中更新粒子的位置和其他属性。 ``` class Particle { constructor(x, y, radius, color, speed) { this.x = x; this.y = y; this.radius = radius; this.color = color; this.speed = speed; } draw(ctx) { ctx.beginPath(); ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2); ctx.fillStyle = this.color; ctx.fill(); ctx.closePath(); } update() { this.x += this.speed.x; this.y += this.speed.y; // ... } } ``` 4. 在Vue组件的updated钩子中更新Canvas大小,并在Canvas上绘制每个粒子。 ``` <script> export default { updated() { const canvas = this.$refs.canvas; const ctx = canvas.getContext('2d'); canvas.width = canvas.offsetWidth; canvas.height = canvas.offsetHeight; // ... particles.forEach(particle => { particle.update(); particle.draw(ctx); }); } } </script> ``` 5. 使用requestAnimationFrame函数来重复播放粒子效果。 ``` function animate() { requestAnimationFrame(animate); ctx.clearRect(0, 0, width, height); particles.forEach(particle => { particle.update(); particle.draw(ctx); }); } animate(); ``` 6. 最后,您可以添加一些效果,如荧光和圆角,来使粒子效果更加美观。 ``` ctx.shadowColor = 'rgba(255, 255, 255, 0.5)'; ctx.shadowBlur = 20; ctx.lineCap = 'round'; ctx.lineJoin = 'round'; ``` 希望这些步骤可以帮到您实现您要的粒子效果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值