高度自定义的粒子喷发效果-Confetti

原文地址:It’s parfetti time! 

It’s parfetti time!

实际名称是Confetti,但是的一个朋友认为parfetti是一个更好的名字。

1--S4w07nyb-r6QV7GBR_cfg.gif

在紧张开发Robinhood Gold之余,由于要等待设计等最终定稿,所以我有时间去弄我将用在Robinhood的第二个开源项目。今天很高兴宣布发布出来给大家试试。

额, 它是什么东西呢?

Confetti是一个可以在任何时候任何地方随机发射纸屑的粒子系统库。可以轻松自定义,非常强大。比如,你可以指定随机发射的源(圆点或者线),物理约束(速度,加速度以及旋转等),以及对纸片(Confetto)(是的,就是这个单词,它是confetti的单数形式 )的任何实现。然后这个library将在屏幕上显示你指定的纸屑发射效果。

这里是爆炸效果的配置案例:

new ConfettiManager(context, generator, confettiSource, container)
        .setTTL(1000) 
        .setBound(explosionBound)
        .setVelocityX(0, defaultVelocityFast)
        .setVelocityY(0, defaultVelocityFast) 
        .enableFadeOut(Utils.getDefaultAlphaInterpolator()) 
        .setRotationalVelocity(180, 180);

结果如下:

1-rE7DqR_ysqgDPEUnb1tWnw.gif

自定义

更详细的文档请阅读 Github README

自定义这个library的基本方式就是设置 ConfettiManager上的各种配置变量来得到适合你的动画。你可以使用bitmap建立confetto,也可以提供一个自定义的Confetto类(实现的例子请参考BitmapConfetto)。

除此之外还支持一些属性,比如纸片触及边界或者生命结束的时候的淡出行为以及拖动。下面是一个自定义的触摸与拖动行为的例子:

1-_l7WJcyPlJmsoSOPtPNEtg.gif

你可以使用这个library去实现很多很酷的效果,比如Periscope的心形冒泡效果或者Facebook Messenger的金币落下动画效果。

性能

在Robinhood里,我们总是在意性能的问题。confetti manager内部回收了confetto对象,因此连续不断的confetti流并不会毁掉内存。再者,因为每个confetto只需知道如何绘制

bitmap,所以你只需为每个bitmap分配一次。最后,我们预先计算了许多动画参数。因此每个动画更新的计算都是非常直接的。总之,除非你一次性的满屏显示很多纸片,否则你不用担心掉帧的问题。

这就本文的内容,如果你有任何需求或者发现bug请在这里提交issues。