diff --git a/LeonidsExamples/src/main/java/com/plattysoft/leonids/examples/ConfettiExampleActivity.java b/LeonidsExamples/src/main/java/com/plattysoft/leonids/examples/ConfettiExampleActivity.java index 275bf3f..22f2fce 100644 --- a/LeonidsExamples/src/main/java/com/plattysoft/leonids/examples/ConfettiExampleActivity.java +++ b/LeonidsExamples/src/main/java/com/plattysoft/leonids/examples/ConfettiExampleActivity.java @@ -1,11 +1,10 @@ package com.plattysoft.leonids.examples; -import com.plattysoft.leonids.ParticleSystem; - import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; +import com.plattysoft.leonids.ParticleSystem; public class ConfettiExampleActivity extends Activity implements OnClickListener { @@ -17,11 +16,13 @@ protected void onCreate(Bundle savedInstanceState) { } @Override - public void onClick(View arg0) { - new ParticleSystem(this, 80, R.drawable.confeti2, 10000) + public void onClick(View arg0) { + ParticleSystem particleSystem = new ParticleSystem(this, 80, R.drawable.confeti2, 10000); + particleSystem .setSpeedModuleAndAngleRange(0f, 0.1f, 180, 180) .setRotationSpeed(144) - .setAcceleration(0.000017f, 90) + .setAcceleration(0.000017f, 90) + .setStartTime(15000) .emit(findViewById(R.id.emiter_top_right), 8); new ParticleSystem(this, 80, R.drawable.confeti3, 10000) diff --git a/LeonidsLib/src/main/java/com/plattysoft/leonids/Particle.java b/LeonidsLib/src/main/java/com/plattysoft/leonids/Particle.java index b4488d2..3b1b199 100644 --- a/LeonidsLib/src/main/java/com/plattysoft/leonids/Particle.java +++ b/LeonidsLib/src/main/java/com/plattysoft/leonids/Particle.java @@ -103,4 +103,8 @@ public Particle activate(long startingMilisecond, List modifie mModifiers = modifiers; return this; } + + public Paint getPaint() { + return mPaint; + } } diff --git a/LeonidsLib/src/main/java/com/plattysoft/leonids/ParticleSystem.java b/LeonidsLib/src/main/java/com/plattysoft/leonids/ParticleSystem.java index 25576c1..bbdcfcb 100644 --- a/LeonidsLib/src/main/java/com/plattysoft/leonids/ParticleSystem.java +++ b/LeonidsLib/src/main/java/com/plattysoft/leonids/ParticleSystem.java @@ -6,6 +6,7 @@ import java.util.Timer; import java.util.TimerTask; +import android.view.animation.Animation; import com.plattysoft.leonids.initializers.AccelerationInitializer; import com.plattysoft.leonids.initializers.ParticleInitializer; import com.plattysoft.leonids.initializers.RotationInitiazer; @@ -14,6 +15,7 @@ import com.plattysoft.leonids.initializers.SpeeddByComponentsInitializer; import com.plattysoft.leonids.initializers.SpeeddModuleAndRangeInitializer; import com.plattysoft.leonids.modifiers.AlphaModifier; +import com.plattysoft.leonids.modifiers.GlobalParticlesModifier; import com.plattysoft.leonids.modifiers.ParticleModifier; import android.animation.Animator; @@ -34,7 +36,7 @@ public class ParticleSystem { - private static final long TIMMERTASK_INTERVAL = 50; + private static final long TIMERTASK_INTERVAL = 50; private ViewGroup mParentView; private int mMaxParticles; private Random mRandom; @@ -50,6 +52,7 @@ public class ParticleSystem { private int mActivatedParticles; private long mEmitingTime; + private List mGlobalParticlesModifiers; private List mModifiers; private List mInitializers; private ValueAnimator mAnimator; @@ -64,23 +67,15 @@ public class ParticleSystem { private int mEmiterYMax; private ParticleSystem(Activity a, int maxParticles, long timeToLive, int parentResId) { - mRandom = new Random(); mParentView = (ViewGroup) a.findViewById(parentResId); + init(a, maxParticles, timeToLive); + } - mModifiers = new ArrayList(); - mInitializers = new ArrayList(); - - mMaxParticles = maxParticles; - // Create the particles - - mParticles = new ArrayList (); - mTimeToLive = timeToLive; - - mParentLocation = new int[2]; - mParentView.getLocationInWindow(mParentLocation); - - DisplayMetrics displayMetrics = a.getResources().getDisplayMetrics(); - mDpToPxScale = (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT); + public ParticleSystem (Activity a, int maxParticles, int drawableRedId, long timeToLive, ViewGroup parentView) { + mParentView = parentView; + Drawable drawable = a.getResources().getDrawable(drawableRedId); + addParticlesInit(drawable); + init(a, maxParticles, timeToLive); } /** @@ -130,23 +125,47 @@ public ParticleSystem(Activity a, int maxParticles, Drawable drawable, long time */ public ParticleSystem(Activity a, int maxParticles, Drawable drawable, long timeToLive, int parentViewId) { this(a, maxParticles, timeToLive, parentViewId); + addParticlesInit(drawable); + } + + private void addParticlesInit(Drawable drawable) { if (drawable instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); for (int i=0; i(); + mModifiers = new ArrayList(); + mInitializers = new ArrayList(); + + mMaxParticles = maxParticles; + // Create the particles + + mParticles = new ArrayList (); + mTimeToLive = timeToLive; + + mParentLocation = new int[2]; + mParentView.getLocationInWindow(mParentLocation); + + DisplayMetrics displayMetrics = a.getResources().getDisplayMetrics(); + mDpToPxScale = (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT); + } + public float dpToPx(float dp) { return dp * mDpToPxScale; } @@ -264,6 +283,16 @@ public ParticleSystem setAcceleration(float acceleration, int angle) { return this; } + public ParticleSystem addInitializer(ParticleInitializer particleInitializer) { + mInitializers.add(particleInitializer); + return this; + } + + public ParticleSystem addGlobalParticlesModifier (GlobalParticlesModifier modifier) { + mGlobalParticlesModifiers.add(modifier); + return this; + } + public ParticleSystem setParentViewGroup(ViewGroup viewGroup) { mParentView = viewGroup; return this; @@ -306,7 +335,7 @@ public ParticleSystem setFadeOut(long duration) { public void emitWithGravity (View emiter, int gravity, int particlesPerSecond, int emitingTime) { // Setup emiter configureEmiter(emiter, gravity); - startEmiting(particlesPerSecond, emitingTime); + startEmitting(particlesPerSecond, emitingTime); } /** @@ -344,32 +373,32 @@ public void emit (View emiter, int particlesPerSecond) { public void emitWithGravity (View emiter, int gravity, int particlesPerSecond) { // Setup emiter configureEmiter(emiter, gravity); - startEmiting(particlesPerSecond); + startEmitting(particlesPerSecond); } - - private void startEmiting(int particlesPerSecond) { + + private void startEmitting(int particlesPerSecond) { mActivatedParticles = 0; mParticlesPerMilisecond = particlesPerSecond/1000f; - // Add a full size view to the parent view + // Add a full size view to the parent view mDrawingView = new ParticleField(mParentView.getContext()); mParentView.addView(mDrawingView); mEmitingTime = -1; // Meaning infinite - mDrawingView.setParticles (mActiveParticles); - updateParticlesBeforeStartTime(particlesPerSecond); + mDrawingView.setParticles(mActiveParticles); + updateParticlesBeforeStartTime(); mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { onUpdate(mCurrentTime); - mCurrentTime += TIMMERTASK_INTERVAL; + mCurrentTime += TIMERTASK_INTERVAL; } - }, 0, TIMMERTASK_INTERVAL); + }, 0, TIMERTASK_INTERVAL); } - public void emit (int emitterX, int emitterY, int particlesPerSecond, int emitingTime) { + public void emit (int emitterX, int emitterY, int particlesPerSecond, int emittingTime) { configureEmiter(emitterX, emitterY); - startEmiting(particlesPerSecond, emitingTime); - } + startEmitting(particlesPerSecond, emittingTime); + } private void configureEmiter(int emitterX, int emitterY) { // We configure the emiter based on the window location to fix the offset of action bar if present @@ -379,22 +408,22 @@ private void configureEmiter(int emitterX, int emitterY) { mEmiterYMax = mEmiterYMin; } - private void startEmiting(int particlesPerSecond, int emitingTime) { + private void startEmitting(int particlesPerSecond, int emittingTime) { mActivatedParticles = 0; - mParticlesPerMilisecond = particlesPerSecond/1000f; + mParticlesPerMilisecond = particlesPerSecond / 1000f; // Add a full size view to the parent view mDrawingView = new ParticleField(mParentView.getContext()); mParentView.addView(mDrawingView); + mEmitingTime = emittingTime; + mDrawingView.setParticles(mActiveParticles); + updateParticlesBeforeStartTime(); - mDrawingView.setParticles (mActiveParticles); - updateParticlesBeforeStartTime(particlesPerSecond); - mEmitingTime = emitingTime; - startAnimator(new LinearInterpolator(), emitingTime + mTimeToLive); + startAnimator(new LinearInterpolator(), emittingTime + mTimeToLive); } public void emit (int emitterX, int emitterY, int particlesPerSecond) { configureEmiter(emitterX, emitterY); - startEmiting(particlesPerSecond); + startEmitting(particlesPerSecond); } @@ -420,13 +449,26 @@ public void oneShot(View emiter, int numParticles) { */ public void oneShot(View emiter, int numParticles, Interpolator interpolator) { configureEmiter(emiter, Gravity.CENTER); + oneShot(numParticles, interpolator); + } + + public void oneShot(int emitterX, int emitterY, int numParticles, Interpolator interpolator) { + configureEmiter(emitterX, emitterY); + oneShot(numParticles, interpolator); + } + + public void oneShot(int emitterX, int emitterY, int numParticles) { + oneShot(emitterX, emitterY, numParticles, new LinearInterpolator()); + } + + private void oneShot(int numParticles, Interpolator interpolator) { mActivatedParticles = 0; mEmitingTime = mTimeToLive; // We create particles based in the parameters for (int i=0; i 0 && miliseconds < mEmitingTime)|| mEmitingTime == -1) && // This point should emit - !mParticles.isEmpty() && // We have particles in the pool - mActivatedParticles < mParticlesPerMilisecond*miliseconds) { // and we are under the number of particles that should be launched + private void update (long milliseconds) { + while (((mEmitingTime > 0 && milliseconds < mEmitingTime)|| mEmitingTime == -1) && // This point should emit + !mParticles.isEmpty() && // We have particles in the pool + mActivatedParticles < mParticlesPerMilisecond*milliseconds) { // and we are under the number of particles that should be launched // Activate a new particle - activateParticle(miliseconds); + activateParticle(milliseconds); } synchronized(mActiveParticles) { + if (!mGlobalParticlesModifiers.isEmpty()) { + for (int i = 0, size = mGlobalParticlesModifiers.size(); i colorList; + + public RandomColorFilterInitializer(List colorList) { + this.colorList = colorList; + } + + @Override + public void initParticle(Particle p, Random r) { + int index = r.nextInt(colorList.size()); + int color = colorList.get(index); + PorterDuffColorFilter filter = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP); + p.getPaint().setColorFilter(filter); + } +} diff --git a/LeonidsLib/src/main/java/com/plattysoft/leonids/modifiers/GlobalAlphaModifier.java b/LeonidsLib/src/main/java/com/plattysoft/leonids/modifiers/GlobalAlphaModifier.java new file mode 100644 index 0000000..9857803 --- /dev/null +++ b/LeonidsLib/src/main/java/com/plattysoft/leonids/modifiers/GlobalAlphaModifier.java @@ -0,0 +1,37 @@ +package com.plattysoft.leonids.modifiers; + +import android.view.animation.Interpolator; +import com.plattysoft.leonids.Particle; + +import java.util.List; + +public class GlobalAlphaModifier implements GlobalParticlesModifier { + + final float fromAlpha; + final float toAlpha; + final long duration; //in ms + final long startTime; //in ms + final Interpolator interpolator; + + final long endTime; + + public GlobalAlphaModifier(float fromAlpha, float toAlpha, long duration, long startTime, Interpolator interpolator) { + this.fromAlpha = fromAlpha; + this.toAlpha = toAlpha; + this.duration = duration; + this.startTime = startTime; + this.interpolator = interpolator; + + endTime = startTime + duration; + } + + @Override + public void apply(List particles, long milliseconds) { + if (milliseconds < startTime || milliseconds > endTime) return; + float currentAlpha = fromAlpha + (toAlpha - fromAlpha) * interpolator.getInterpolation((milliseconds - startTime) / (float)duration); + + for(int i=0, size=particles.size(); i particles, long milliseconds); + +} \ No newline at end of file