本文实例讲述了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 alivepublic static final int STATE_DEAD = 1;// all particles are deadprivate Particle[] particles;// particles in the explosionprivate int x, y;// the explosion"s originprivate float gravity;// the gravity of the explosion (+ upward, - down)private float wind;// speed of wind on horizontalprivate int size; // number of particlesprivate int state; // whether it"s still active or notpublic 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 alivepublic static final int STATE_DEAD = 1; // particle is deadpublic static final int DEFAULT_LIFETIME= 200; // play with thispublic static final int MAX_DIMENSION= 5;// the maximum width or heightpublic static final int MAX_SPEED= 10;// maximum speed (per update)private int state; // particle is alive or deadprivate float widht;// width of the particleprivate float height;// height of the particleprivate float x, y; // horizontal and vertical positionprivate double xv, yv; // vertical and horizontal velocityprivate int age;// current age of the particleprivate int lifetime;// particle dies when it reaches this valueprivate int color; // the color of the particleprivate Paint paint;// internal use to avoid instantiationpublic 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 speedif (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 alphaint a = this.color >>> 24;a -= 2; // fade by 5if (a <= 0) {// if reached transparency kill the particlethis.state = STATE_DEAD;} else {this.color = (this.color & 0x00ffffff) + (a << 24);// set the new alphathis.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 lifethis.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 collisionif (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程序设计有所帮助。