1. 程式人生 > >Android 流星雨,紅包雨,大爆炸,瀑布飛花以及漣漪等炫酷效果

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();
    }

}
我對重要方法解釋做了標註,吧流星雨改造成紅包雨,因為我做的就是紅包雨效果,好了以上就是多。