Android实现粒子爆炸效果的方法
作者:红薯
这篇文章主要介绍了Android实现粒子爆炸效果的方法,实例分析了Android动画特效的实现技巧,需要的朋友可以参考下
本文实例讲述了Android实现粒子爆炸效果的方法。分享给大家供大家参考。具体如下:
1. Explosion.java文件:
package net.obviam.particles.model; import android.graphics.Canvas; import android.graphics.Rect; import android.util.Log; public class Explosion { private static final String TAG = Explosion.class.getSimpleName(); public static final int STATE_ALIVE = 0; // at least 1 particle is alive public static final int STATE_DEAD = 1; // all particles are dead private Particle[] particles; // particles in the explosion private int x, y; // the explosion's origin private float gravity; // the gravity of the explosion (+ upward, - down) private float wind; // speed of wind on horizontal private int size; // number of particles private int state; // whether it's still active or not public Explosion(int particleNr, int x, int y) { Log.d(TAG, "Explosion created at " + x + "," + y); this.state = STATE_ALIVE; this.particles = new Particle[particleNr]; for (int i = 0; i < this.particles.length; i++) { Particle p = new Particle(x, y); this.particles[i] = p; } this.size = particleNr; } public Particle[] getParticles() { return particles; } public void setParticles(Particle[] particles) { this.particles = particles; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public float getGravity() { return gravity; } public void setGravity(float gravity) { this.gravity = gravity; } public float getWind() { return wind; } public void setWind(float wind) { this.wind = wind; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public int getState() { return state; } public void setState(int state) { this.state = state; } // helper methods ------------------------- public boolean isAlive() { return this.state == STATE_ALIVE; } public boolean isDead() { return this.state == STATE_DEAD; } public void update() { if (this.state != STATE_DEAD) { boolean isDead = true; for (int i = 0; i < this.particles.length; i++) { if (this.particles[i].isAlive()) { this.particles[i].update(); isDead = false; } } if (isDead) this.state = STATE_DEAD; } } public void update(Rect container) { if (this.state != STATE_DEAD) { boolean isDead = true; for (int i = 0; i < this.particles.length; i++) { if (this.particles[i].isAlive()) { this.particles[i].update(container); // this.particles[i].update(); isDead = false; } } if (isDead) this.state = STATE_DEAD; } } public void draw(Canvas canvas) { for(int i = 0; i < this.particles.length; i++) { if (this.particles[i].isAlive()) { this.particles[i].draw(canvas); } } } }
2. Particle.java文件如下:
package net.obviam.particles.model; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; public class Particle { public static final int STATE_ALIVE = 0; // particle is alive public static final int STATE_DEAD = 1; // particle is dead public static final int DEFAULT_LIFETIME = 200; // play with this public static final int MAX_DIMENSION = 5; // the maximum width or height public static final int MAX_SPEED = 10; // maximum speed (per update) private int state; // particle is alive or dead private float widht; // width of the particle private float height; // height of the particle private float x, y; // horizontal and vertical position private double xv, yv; // vertical and horizontal velocity private int age; // current age of the particle private int lifetime; // particle dies when it reaches this value private int color; // the color of the particle private Paint paint; // internal use to avoid instantiation public int getState() { return state; } public void setState(int state) { this.state = state; } public float getWidht() { return widht; } public void setWidht(float widht) { this.widht = widht; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; } public float getX() { return x; } public void setX(float x) { this.x = x; } public float getY() { return y; } public void setY(float y) { this.y = y; } public double getXv() { return xv; } public void setXv(double xv) { this.xv = xv; } public double getYv() { return yv; } public void setYv(double yv) { this.yv = yv; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getLifetime() { return lifetime; } public void setLifetime(int lifetime) { this.lifetime = lifetime; } public int getColor() { return color; } public void setColor(int color) { this.color = color; } // helper methods ------------------------- public boolean isAlive() { return this.state == STATE_ALIVE; } public boolean isDead() { return this.state == STATE_DEAD; } public Particle(int x, int y) { this.x = x; this.y = y; this.state = Particle.STATE_ALIVE; this.widht = rndInt(1, MAX_DIMENSION); this.height = this.widht; // this.height = rnd(1, MAX_DIMENSION); this.lifetime = DEFAULT_LIFETIME; this.age = 0; this.xv = (rndDbl(0, MAX_SPEED * 2) - MAX_SPEED); this.yv = (rndDbl(0, MAX_SPEED * 2) - MAX_SPEED); // smoothing out the diagonal speed if (xv * xv + yv * yv > MAX_SPEED * MAX_SPEED) { xv *= 0.7; yv *= 0.7; } this.color = Color.argb(255, rndInt(0, 255), rndInt(0, 255), rndInt(0, 255)); this.paint = new Paint(this.color); } /** * Resets the particle * @param x * @param y */ public void reset(float x, float y) { this.state = Particle.STATE_ALIVE; this.x = x; this.y = y; this.age = 0; } // Return an integer that ranges from min inclusive to max inclusive. static int rndInt(int min, int max) { return (int) (min + Math.random() * (max - min + 1)); } static double rndDbl(double min, double max) { return min + (max - min) * Math.random(); } public void update() { if (this.state != STATE_DEAD) { this.x += this.xv; this.y += this.yv; // extract alpha int a = this.color >>> 24; a -= 2; // fade by 5 if (a <= 0) { // if reached transparency kill the particle this.state = STATE_DEAD; } else { this.color = (this.color & 0x00ffffff) + (a << 24); // set the new alpha this.paint.setAlpha(a); this.age++; // increase the age of the particle // this.widht *= 1.05; // this.height *= 1.05; } if (this.age >= this.lifetime) { // reached the end if its life this.state = STATE_DEAD; } // http://lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/ //32bit // var color:uint = 0xff336699; // var a:uint = color >>> 24; // var r:uint = color >>> 16 & 0xFF; // var g:uint = color >>> 8 & 0xFF; // var b:uint = color & 0xFF; } } public void update(Rect container) { // update with collision if (this.isAlive()) { if (this.x <= container.left || this.x >= container.right - this.widht) { this.xv *= -1; } // Bottom is 480 and top is 0 !!! if (this.y <= container.top || this.y >= container.bottom - this.height) { this.yv *= -1; } } update(); } public void draw(Canvas canvas) { // paint.setARGB(255, 128, 255, 50); paint.setColor(this.color); canvas.drawRect(this.x, this.y, this.x + this.widht, this.y + this.height, paint); // canvas.drawCircle(x, y, widht, paint); } }
希望本文所述对大家的Android程序设计有所帮助。