Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android粒子爆炸效果

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程序设计有所帮助。

您可能感兴趣的文章:
阅读全文