很久以前,做了一个关于旅游景区的项目,要求在等待页面实现一个炊烟袅袅升起的效果,本来是没有这个的,鬼知道我们的ios大神(坑货)从哪找来的,我们项目经理一看非常满意,要我们也加一个!(团队有这样的大神(坑货)都是泪啊!!!)。

Android音乐粒子动效 安卓粒子动画_Leonids

(擦干泪,该干的还是要干)首先看这个炊烟,从下往上不间断的旋转上升并且有颜色渐淡的效果,这里至少用到了动画的scale、rotato、alpha三种效果,但是再仔细看发现炊烟的运动轨迹是不规则的,所以使用补间动画是不可能完成的,那么就只有帧动画了,但是我们可怜的ui不会做,于是问了下大神,结果顺便甩过来一张图片

Android音乐粒子动效 安卓粒子动画_Android音乐粒子动效_02

   (这个图是白色的,调成灰色是为了和背景区分开)

并且曰了句:“你搜一下粒子效果”。

于是乎,在我们所熟悉的view动画和属性动画之外,我又发现了一项粒子动画,粒子动画在html和flash方面早有应用,专门用于处理一些包含颗粒状图形并且不规则运动的拟物动画,包括雪花啦,雨滴啦,雾气啦,烟花啦等等效果,在github上搜了半天,终于功夫不负有心人,找到了一个专门做粒子效果的库http://plattysoft.github.io/Leonids/

这个粒子库只有81kb,点此下载,而且使用起来非常方便,首先把下载下来的jar包放入lib中,然后在你工程的build.gradle中配置

dependencies {    compile 'com.plattysoft.leonids:LeonidsLib:1.3.1'}

在activity_main.xml中设置一个背景,在烟囱的位置设置一个view,

Android音乐粒子动效 安卓粒子动画_android粒子动画_03


下面是代码部分,根据Leonids库的官方文档来看,粒子库的可变性非常强,根据不同的方法所产生的效果也是千差万别,所以在剔除所有的效果前,我们先从最主要的开始看


new ParticleSystem(this, 10000, R.mipmap.startup_smoke, 5000).emit(tvSmoke, 50);

反编译后


public ParticleSystem(Activity a, int maxParticles, int drawableRedId, long timeToLive) {
    this(a, maxParticles, a.getResources().getDrawable(drawableRedId), timeToLive, 16908290);
}

第一个参数是activity,第二个是最多的粒子数,第三个是粒子的图片资源,第四个是持续时间,毫秒制,默认持续时间结束后会从开始重复。


public void emit(View emiter, int particlesPerSecond) {
    this.emitWithGravity(emiter, 17, particlesPerSecond);
}

第一个参数为view,view的位置即为粒子效果产生的位置,当然后面还可以设置偏移量,第二个为每秒所产生的粒子数量,这个参数和持续时间的乘积不应当小于最多粒子数,否则动画就会断片。

下面是一些方法的探究

setAcceleration(float acceleration, int angle):规定了粒子运动的加速度和方向;

setRotationSpeedRange(float minRotationSpeed, float maxRotationSpeed):粒子运动的最小和最大的旋转角度

setFadeOut(long duration):淡出的区间,默认从不透明到完全透明

setScaleRange(float minScale, float maxScale):缩放的区间,这与补间动画类似

另外还有一个修饰器,可以对常用动画进行修饰

addModifier(ParticleModifier modifier),可以修饰的动画有:

  • AlphaModifier (int initialValue, int finalValue, long startMilis, long endMilis)
  • AlphaModifier (int initialValue, int finalValue, long startMilis, long endMilis, Interpolator interpolator)
  • ScaleModifier (float initialValue, float finalValue, long startMilis, long endMilis)
  • ScaleModifier (float initialValue, float finalValue, long startMilis, long endMilis, Interpolator interpolator)

除了上述当中的方法,jar包中还包含了其他的很多,实际当中,大家可以自行调试就理解这些方法的用途和效果,这里就不一一例举了。

通过一系列的调试,最终实现效果的代码如下

<span style="font-size:18px;">new ParticleSystem(this, 500, R.mipmap.startup_smoke, 5000)
        .setAcceleration(0.00003f, 270)
        .addModifier(new ScaleModifier(0, 1.2f, 1000, 4000))
        .setFadeOut(5000)
        .setRotationSpeedRange(0, 180)
        .emit(tvSmoke, 50);</span>



代码非常简单,关键是在实际当中,大家要有耐心去探讨,去调试,这里只是给出了实例,具体效果在不同的手机当中可能会有差异,大家根据实际情况自行调试。