Android超强大的粒子动画库,流星雨,爆炸,满屏飞花,等粒子特效快速实现

Leonids是一个与标准Android UI配合使用的粒子系统库。该库非常轻巧,LeonidsLib.jar只有81Kb。

 

首先声明一点:因为我也是刚了解ParticleSystem,因为我只是需要用里面的效果,说的不对的地方大家可以指出来。

我了解的效果有红包雨,流星雨,大爆炸,瀑布飞花以及涟漪这几张效果,其实还可以做很多的效果,需要自己去研究亲自试一试就明白了。

老规矩先看图:

流星雨,从屏幕左侧划过屏幕

红包雨,从屏幕上方任意角度向下飘落,任意方向,任意数量,任意时间,任意轨迹,任意图片,是不是很屌

涟漪:类似于大爆炸,就像水滴落在水里一样

飞花:从左上角向全屏飞出,当然角度自己控制

大爆炸:从中间点向四周扩散

 

好了,图大概就这些,接下来就是代码了,很简单:

首先我们把库引进来,方式非常简单,目前最新版本是1.3.2的

 compile 'com.plattysoft.leonids:LeonidsLib:1.3.2'


做完以上部分,这个强大的粒子动画库我们已经引入进来了

一:爆炸效果

首先我们做一个测试

    new ParticleSystem(mActivity, 1000, R.mipmap.flower0, 3000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 360)
                        .setRotationSpeed(30)
                        .setAcceleration(0, 90)
                        .oneShot(mButton1, 200);
在Activity非onCreate中,调用以上代码,我们就可以看到一个酷炫的爆炸效果

然后我解释下每个参数的含义

 new ParticleSystem(mActivity, 1000, R.mipmap.flower0, 3000)
第一个参数是上下文对象(context),第二个参数(最大粒子数目),第三个参数(粒子资源),第四个参数(粒子存留时间)

第二个参数的含义是指同时存在的最大粒子数目,第四个参数是指每个粒子的最长留存时间;

   .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 360)
第一个,第二个参数,是一个速度区间,这个速度是粒子的发射速度(如果没有设定重力,那么粒子的速度是恒定的,如果设定了重力,粒子的速度会根据重力方向改变),粒子会在这个速度区间随机,每个粒子都是独立的

第三个,第四个参数,是指发射粒子的角度,0-360,的任意区间,这个参数的作用在于。我们操控发射粒子的方向,同样会在这个范围内随机

  .setRotationSpeed(30)
这个参数的含义是指,图片元素的自转,粒子元素自身的旋转速度

.setAcceleration(0, 90)
这个参数含义是指,重力加速度,第一个为重力加速度的值,第二个为重力加速度的方向,理论上讲我们这个设置任意方向为重力方向

 .oneShot(mButton1, 200);
见明知意,oneShot就是发射一次,第一个参数是发射的位置,第二个参数是发射的粒子数量

二:飞花效果

 new ParticleSystem(mActivity, 1000, R.mipmap.flower0, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 90)
                        .setRotationSpeed(60)
                        .setAcceleration(0.00005f, 90)
                        .emit(0, -100, 30, 10000);
其他方法同上,唯一区别在于

.emit(0, -100, 30, 10000);
第一个参数,和第二个参数,是屏幕的像素坐标,粒子动画的发射点,

第三个参数是每秒发射多少粒子

第四个参数是持续发射多少秒

时间到了之后,粒子会自动停止发射

三:构造函数,和一些方法

 粒子系统通常用于游戏中,用途广泛:爆炸,火灾,烟雾等。这些效果也可以在普通应用程序中使用,以添加“多汁”或“俏皮设计”元素。正是因为它的主要用途是游戏,所有引擎都支持粒子系统,但对于标准的Android用户界面来说没有这样的东西。这意味着如果你正在构建一个Android应用程序,并且你想要一个粒子系统,那么你必须包含一个图形引擎并使用OpenGL--这太过于夸张了 - 或者你必须自己实现它。Leonids将填补这一空白,为使用标准Android UI的开发人员带来粒子系统。

所有构造函数都使用活动,粒子的最大数量和生存时间。区别在于如何指定粒子的图像。

受支持的绘图是:BitmapDrawable和AnimationDrawable。

ParticleSystem(Activity a,int maxParticles,int drawableRedId,long timeToLive)
ParticleSystem(Activity a,int maxParticles,Drawable drawable,long timeToLive)
ParticleSystem(Activity a,int maxParticles,位图位图,long timeToLive)
ParticleSystem(Activity a,int maxParticles,AnimationDrawable动画,long timeToLive)

还有一些构造函数可以接收视图ID作为父视图,因此您可以将粒子系统放置在背景上(或任何两个视图之间)
ParticleSystem(Activity a,int maxParticles,int drawableRedId,long timeToLive,int parentViewId)
ParticleSystem(Activity a,int maxParticles,Drawable drawable,long timeToLive,int parentViewId)
ParticleSystem(Activity a,int maxParticles,位图位图,long timeToLive,int parentViewId)
ParticleSystem(Activity a,int maxParticles,AnimationDrawable动画,long timeToLive,int parentViewId)
另一个构造函数接收父视图组和drawable,用于不适合将参考传递给Activity的地方


ParticleSystem(ViewGroup parentView,int maxParticles,Drawable drawable,long timeToLive)
在粒子系统上进行配置的可用方法有:

setSpeedRange(float speedMin,float speedMax):使用0-360作为角度范围
setSpeedModuleAndAngleRange(float speedMin,float speedMax,int minAngle,int maxAngle)
setSpeedByComponentsRange(float speedMinX,float speedMaxX,float speedMinY,float speedMaxY)
setInitialRotationRange(int minAngle,int maxAngle)
setScaleRange(float minScale,float maxScale)
setRotationSpeed(float rotationSpeed)
setRotationSpeedRange(float minRotationSpeed,float maxRotationSpeed)
setAcceleration(浮动加速度,浮动角度)
setFadeOut(long milisecondsBeforeEnd,Interpolator interpolator):使用插值器实现简单淡出效果的实用方法
setFadeOut(长期持续时间):简单淡出的实用方法
如果您想要使用已创建和移动的粒子,此方法使用已经创建好的粒子组

setStartTime(int time)

发射器
从发射器发射每秒的粒子数量。如果设置发射时间,那么发射器会在该时间后停止,否则它是连续的。

基本的发射器
发射(View发射器,int particlesPerSecond)
发射(View发射器,int particlesPerSecond,int发射时间)
基于(x,y)坐标发射
发射(int emitterX,int emitterY,int particlesPerSecond)
emit(int emitterX,int emitterY,int particlesPerSecond,int emitingTime)
用重力发射
emitWithGravity(查看发射器,int引力,int particlesPerSecond)
emitWithGravity(查看发射器,int引力,int particlesPerSecond,int发射时间)
更新,停止和取消
updateEmitPoint(int emitterX,int emitterY)动态更新发射点。
updateEmitPoint(View emiter,int gravity)使用重力动态更新发射点。
stopEmitting()停止发射新的粒子,但活动的粒子被更新。
取消()停止新粒子的发射,并将活动球粒排出。
每个粒子系统仅为粒子使用一个图像。如果你想要发射不同的粒子,你需要为它们中的每一个创建一个粒子系统。

每个粒子发射示例,只能发射一种粒子,如果我们要发射多种不同的粒子,就需要创建更多的发射示例

 

以上是我看

https://blog.csdn.net/mymolit/article/details/79578693         的截取过来的,我比较懒,大家也可以去看看,接下来是我自己写的

https://download.csdn.net/download/mymolit/1029           这个是原来的下载地址,大家可以下载下来试试看。

 

这是我的代码MainActivity:

package com.molit.particleanimation;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.plattysoft.leonids.ParticleSystem;

public class MainActivity extends Activity {

    private Button mButton0;
    private Button mButton1;
    private Button mButton2;
    private Button mButton3;
    private MainActivity mActivity;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = this;
        setContentView(R.layout.activity_main);
        intView();
    }


    private void intView() {
        mButton0 = (Button) findViewById(R.id.btn0);
        mButton1 = (Button) findViewById(R.id.btn1);
        mButton2 = (Button) findViewById(R.id.btn2);
        mButton3 = (Button) findViewById(R.id.btn3);

//        new ParticleSystem(mActivity, 10, R.mipmap.star1, 10000)//第一个参数是上下文对象(context),第二个参数(最大粒子数目),第三个参数(粒子资源),第四个参数(粒子存留时间)
//                .setSpeedModuleAndAngleRange(0.0f, 0.0f, 0, 110)//第一个,第二个参数,是一个速度区间,这个速度是粒子的发射速度(如果没有设定重力,那么粒子的速度是恒定的,如果设定了重力,粒子的速度会根据重力方向改变),粒子会在这个速度区间随机,每个粒子都是独立的第三个,第四个参数,是指发射粒子的角度,0-360,的任意区间,这个参数的作用在于。我们操控发射粒子的方向,同样会在这个范围内随机
//                .setRotationSpeed(30)//图片元素的自转,粒子元素自身的旋转速度
//                .setAcceleration(0.0005f, 220)//重力加速度,第一个为重力加速度的值,第二个为重力加速度的方向,理论上讲我们这个设置任意方向为重力方向
//                .emit(0, 0, 1, 10000);//第一个参数,和第二个参数,是屏幕的像素坐标,粒子动画的发射点,第三个参数是每秒发射多少粒子第四个参数是持续发射多少秒时间到了之后,粒子会自动停止发射
//                .oneShot(mButton1, 400);//第一个参数是发射的位置,第二个参数是发射的粒子数量

        mButton0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new ParticleSystem(mActivity, 50, R.drawable.fulldiscount, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 150)
                        .setRotationSpeed(30)
                        .setAcceleration(0.0003f, 80)
                        .emit(100, -50, 5, 10000);

                new ParticleSystem(mActivity, 40, R.drawable.red_envelope, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.4f, 0, 150)
                        .setRotationSpeed(30)
                        .setAcceleration(0.0003f, 80)
                        .emit(300, -50, 5, 10000);

                new ParticleSystem(mActivity, 30, R.drawable.fulldiscount, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 150)
                        .setRotationSpeed(30)
                        .setAcceleration(0.0003f, 80)
                        .emit(600, -50, 5, 10000);

                new ParticleSystem(mActivity, 20, R.drawable.red_envelope, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 150)
                        .setRotationSpeed(30)
                        .setAcceleration(0.0003f, 80)
                        .emit(900, -50, 5, 10000);
//                mButton0.post(new Runnable() {
//                    @Override
//                    public void run() {
//                        new ParticleSystem(mActivity, 100, R.drawable.red_envelope, 10000)
//                                .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 180)
//                                .setRotationSpeed(30)
//                                .setAcceleration(0.0003f, 80)
//                                .emit(100, -50, 5, 10000);
//
//                        new ParticleSystem(mActivity, 100, R.drawable.red_envelope, 10000)
//                                .setSpeedModuleAndAngleRange(0.05f, 0.4f, 0, 180)
//                                .setRotationSpeed(30)
//                                .setAcceleration(0.0003f, 80)
//                                .emit(300, -50, 5, 10000);
//
//                        new ParticleSystem(mActivity, 100, R.drawable.red_envelope, 10000)
//                                .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 180)
//                                .setRotationSpeed(30)
//                                .setAcceleration(0.0003f, 80)
//                                .emit(600, -50, 5, 10000);
//
//                        new ParticleSystem(mActivity, 100, R.drawable.red_envelope, 10000)
//                                .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 360)
//                                .setRotationSpeed(30)
//                                .setAcceleration(0.0003f, 80)
//                                .emit(900, -50, 5, 10000);
//
//                        new Thread(new Runnable() {
//                            @Override
//                            public void run() {
//                                try {
//                                    Thread.sleep(800);
//                                } catch (InterruptedException e) {
//                                    e.printStackTrace();
//                                }
//                                runOnUiThread(new Runnable() {
//                                    @Override
//                                    public void run() {
//                                        new ParticleSystem(mActivity, 100, R.drawable.red_envelope, 10000)
//                                                .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 180)
//                                                .setRotationSpeed(30)
//                                                .setAcceleration(0.0001f, 80)
//                                                .emit(100, -50, 5, 10000);
//
//                                        new ParticleSystem(mActivity, 100, R.drawable.red_envelope, 10000)
//                                                .setSpeedModuleAndAngleRange(0.05f, 0.4f, 0, 180)
//                                                .setRotationSpeed(30)
//                                                .setAcceleration(0.0001f, 80)
//                                                .emit(300, -50, 5, 10000);
//
//                                        new ParticleSystem(mActivity, 100, R.drawable.red_envelope, 10000)
//                                                .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 180)
//                                                .setRotationSpeed(30)
//                                                .setAcceleration(0.0001f, 80)
//                                                .emit(600, -50, 5, 10000);
//
//                                        new ParticleSystem(mActivity, 100, R.drawable.red_envelope, 10000)
//                                                .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 360)
//                                                .setRotationSpeed(30)
//                                                .setAcceleration(0.0001f, 80)
//                                                .emit(900, -50, 5, 10000);
//                                    }
//                                });
//                            }
//                        }).start();
//                    }
//                });
            }
        });

        mButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                new ParticleSystem(mActivity, 1000, R.mipmap.flower0, 3000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 360)
                        .setRotationSpeed(30)
                        .setAcceleration(0, 90)
                        .oneShot(mButton1, 200);
            }
        });


        mButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new ParticleSystem(mActivity, 1000, R.mipmap.flower0, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 90)
                        .setRotationSpeed(60)
                        .setAcceleration(0.00005f, 90)
                        .emit(0, -100, 30, 10000);
                new ParticleSystem(mActivity, 1000, R.mipmap.flower1, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 90)
                        .setRotationSpeed(30)
                        .setAcceleration(0.00005f, 90)
                        .emit(0, -100, 30, 10000);
                new ParticleSystem(mActivity, 1000, R.mipmap.flower3, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 90)
                        .setRotationSpeed(60)
                        .setAcceleration(0.00005f, 90)
                        .emit(0, -100, 30, 10000);
                new ParticleSystem(mActivity, 1000, R.mipmap.flower4, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 90)
                        .setRotationSpeed(80)
                        .setAcceleration(0.00005f, 90)
                        .emit(0, -100, 30, 10000);
                new ParticleSystem(mActivity, 1000, R.mipmap.flower5, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 90)
                        .setRotationSpeed(10)
                        .setAcceleration(0.00005f, 90)
                        .emit(0, -100, 30, 10000);
                new ParticleSystem(mActivity, 1000, R.mipmap.flower6, 10000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.2f, 0, 90)
                        .setRotationSpeed(50)
                        .setAcceleration(0.00005f, 90)
                        .emit(0, -100, 30, 10000);
            }
        });


        mButton3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new ParticleSystem(mActivity, 1000, R.mipmap.flower1, 5000)
                        .setSpeedModuleAndAngleRange(0.05f, 0.05f, 0, 360)
                        .setRotationSpeed(30)
                        .setAcceleration(0, 90)
                        .oneShot(mButton3, 300);
            }
        });

    }
    public void viewVit() {

        new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    Thread.sleep(10000);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mButton0.setVisibility(View.VISIBLE);
                            mButton1.setVisibility(View.VISIBLE);
                            mButton2.setVisibility(View.VISIBLE);
                            mButton3.setVisibility(View.VISIBLE);
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }
        }).start();
    }

}
我对重要方法解释做了标注,吧流星雨改造成红包雨,因为我做的就是红包雨效果,好了以上就是多。
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值