| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
9年前发布

Android实现烟花效果

HolderSurfaceView.java    package com.lyc;    import android.graphics.PixelFormat;  import android.view.SurfaceView;      public class HolderSurfaceView {      private HolderSurfaceView() {        }      private SurfaceView mSurfaceView;      private static HolderSurfaceView mHolderSurfaceView = null;        public static HolderSurfaceView getInstance() {          if (mHolderSurfaceView == null)              mHolderSurfaceView = new HolderSurfaceView();          return mHolderSurfaceView;      }               public void setSurfaceView(SurfaceView view) {          mSurfaceView = view;          mSurfaceView.setZOrderOnTop(true);          mSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);      }        public SurfaceView getSurfaceView() {          return mSurfaceView;      }  }    DrawTopBase.java    package com.lyc;      import android.content.Context;  import android.graphics.Canvas;  import android.graphics.Paint;  import android.graphics.PorterDuff.Mode;  import android.graphics.PorterDuffXfermode;  import android.graphics.Rect;  import android.view.MotionEvent;  import android.view.SurfaceHolder;  import android.view.SurfaceHolder.Callback;  import android.view.SurfaceView;  import android.view.View;  import android.view.View.OnTouchListener;    public class DrawTopBase implements Runnable, Callback ,OnTouchListener{      protected DrawStatus mStatus = DrawStatus.NoWork;      protected SurfaceView mSurfaceView;      protected SurfaceHolder mSurfaceHolder;      protected Context mContext;      protected Rect mSurfaceRect = new Rect(0, 0, 0, 0); //前两个参数是左上角的坐标,后两个参数是右下角的坐标(不是宽度和高度)        public DrawTopBase() {          setSurfaceView(HolderSurfaceView.getInstance().getSurfaceView());      }        public void setSurfaceView(SurfaceView view) {          mSurfaceView = view;          mContext = mSurfaceView.getContext();          mSurfaceHolder = mSurfaceView.getHolder();          mSurfaceHolder.addCallback(this);  //        mSurfaceRect.set(new Rect(0, 0, mSurfaceView.getWidth(), mSurfaceView.getHeight()));          mSurfaceRect.set(new Rect(100, 100, 250, 250));          set();      }             public void set() {          setRect(mSurfaceRect);      }        protected Thread mThread = null;             public void begin() {                 if (mThread == null) {              mThread = new Thread(this);              mThread.start();            }      }        public void end() {          mStatus = DrawStatus.Ending;      }             protected void doWork(Canvas canvas) {        }             protected void endWork() {        }        protected Paint mPaint = new Paint();             protected void clear(Canvas canvas) {          mPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));          canvas.drawPaint(mPaint);          mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC));      }        protected void clear() {          synchronized (mSurfaceHolder) {              Canvas canvas = this.mSurfaceHolder.lockCanvas();              try {                  clear(canvas);              } catch (Exception e) {                  e.printStackTrace();              } finally {                  if (canvas != null)                      mSurfaceHolder.unlockCanvasAndPost(canvas);              }          }      }        protected void doChange() {          change();      }             protected void change() {        }    //    protected Rect mRect = new Rect(0, 0, 0, 0);      protected Rect mRect = new Rect(50, 50, 250, 250);        public void setRect(Rect r) {          mRect.set(r);      }        public Rect getRect() {          return mRect;      }                    protected enum DrawStatus {          NoWork, Drawing, Ending, Destroyed      };        protected long mBegintime;        public void run() {          mStatus = DrawStatus.Drawing;          //获取当前时间          starttime = System.currentTimeMillis();          mBegintime = System.currentTimeMillis();          // 建立两次缓存          clear();          clear();          while (mStatus == DrawStatus.Drawing) {              synchronized (mSurfaceHolder) {                  Canvas canvas = this.mSurfaceHolder.lockCanvas(getRect());                  try {                      if (canvas != null) {                          clear(canvas);                          doWork(canvas);                      }                  } catch (Exception e) {                      e.printStackTrace();                  } finally {                      if (canvas != null)                          mSurfaceHolder.unlockCanvasAndPost(canvas);                  }                  doChange();                             }              calculatePerframe();          }          if (mStatus != DrawStatus.Destroyed)              clear();          mThread = null;          endWork();      }             protected long starttime;      // 每帧时间 60帧附近 第一次计算前使用 毫秒      private float perframe = 6;   //6=16        private int count = 0;        // 每隔多长时间测试一次帧时间      private int mRefreshSpeed = 30; //30=12        // 设定要求多长时间每帧 24帧每秒      private float mFPS = 1000 / 4;      private float sleep = mFPS;        // 设置刷新频率      public void setFPS(int fps) {          mFPS = 1000 / fps;      }             protected void calculatePerframe() {          count++;          if (count == mRefreshSpeed) // 由于每帧计算会降低游戏效率。20到50差不多          {              long timepass = System.currentTimeMillis();              long time = timepass - starttime;              perframe = time / mRefreshSpeed;// 每帧时间              sleep = perframe > mFPS ? mFPS - (perframe - mFPS) / mRefreshSpeed : mFPS;              starttime = timepass;              count = 0;          }          try {                         Thread.sleep((long) (sleep));  //         Thread.sleep(1000);          } catch (InterruptedException e) {              e.printStackTrace();          }  //        new Thread(){  //          public void run(){  //           try {  //              //      sleep(2000);  //     } catch (Exception e) {  //      // TODO: handle exception  //      e.printStackTrace();  //     }finally{  ////      finish();  //     }  //          }  //         }.start();        }        public void surfaceChanged(SurfaceHolder holder, int format, int width,              int height) {          mSurfaceRect.set(new Rect(0, 0, width, height));  //        mSurfaceRect.set(new Rect(0, 0, 200, 500));          set();      }        public void surfaceCreated(SurfaceHolder holder) {        }        public void surfaceDestroyed(SurfaceHolder holder) {          mStatus = DrawStatus.Destroyed;      }        public boolean onTouch(View v, MotionEvent event) {          // TODO Auto-generated method stub          return false;      }  }           package com.lyc;    import java.util.Random;    import android.graphics.Bitmap;  import android.graphics.Canvas;  import android.graphics.Rect;  import android.view.MotionEvent;  import android.view.SurfaceHolder;  import android.view.View;    public class DrawYH extends DrawTopBase {       private int m_nAppX;       private int m_nAppY;       private int m_centerX;       private int m_centerY;       private int m_mouseX;       private int m_mouseY;       private int m_sleepTime;       private boolean isError;       private boolean m_isPaintFinished;       boolean isRunning;       boolean isInitialized;       Thread runner;       int pix0[];       Bitmap offImage;       // Image dbImg;       int pixls;       int pixls2;       Random rand;       int bits;       double bit_px[];       double bit_py[];       double bit_vx[];       double bit_vy[];       int bit_sx[];       int bit_sy[];       int bit_l[];       int bit_f[];       int bit_p[];       int bit_c[];       int bit_max = 100;  //     int bit_sound = 2;       int ru;       int rv;      @Override      public void surfaceCreated(SurfaceHolder holder) {          // TODO Auto-generated method stub          super.surfaceCreated(holder);          this.begin();  //        stopBGMedia();  //        bgMedia = new GameSoundMedia(mContext);  //        bgMedia.playInMediaPlayer(R.raw.bg, null);      }    //    private void stopBGMedia() {  //        if (bgMedia != null) {  //            try {  //                bgMedia.stopAll();                 //                bgMedia = null;  //            } catch (Exception e) {  //                e.printStackTrace();  //            }  //  //        }  //    }        @Override      public void surfaceDestroyed(SurfaceHolder holder) {  //        stopBGMedia();          super.surfaceDestroyed(holder);      }        @Override      public void set() {          super.set();          if (this.getRect().width() > 10 && this.getRect().height() > 10)              init();      }         Draw.java       //重要类        public Draw() {     //画烟花          super();          m_mouseX = 0;          m_mouseY = 0;          m_sleepTime = 5;   //5          isError = false;          isInitialized = false;          rand = new Random();          bits = 10000;           //控制烟花数量          bit_px = new double[bits];          bit_py = new double[bits];          bit_vx = new double[bits];          bit_vy = new double[bits];          bit_sx = new int[bits];          bit_sy = new int[bits];          bit_l = new int[bits];          bit_f = new int[bits];          bit_p = new int[bits];          bit_c = new int[bits];          ru = 50;          rv = 50;          // init();      }        Canvas mCanvas;      private Rect drawRect = new Rect(0, 0, 0, 0);        public void init() {                  m_nAppX = this.getRect().width() / 2;          m_nAppY = this.getRect().height() / 2;          drawRect = new Rect(0, 0, m_nAppX, m_nAppY);          m_centerX = m_nAppX / 2;          m_centerY = m_nAppY / 2;          m_mouseX = m_centerX;          m_mouseY = m_centerY;          // resize(m_nAppX, m_nAppY);          pixls = m_nAppX * m_nAppY;          pixls2 = pixls - m_nAppX * 3;          pix0 = new int[pixls];          offImage = Bitmap.createBitmap(m_nAppX, m_nAppY,                  Bitmap.Config.ARGB_8888);          mCanvas = new Canvas();          mCanvas.setBitmap(offImage);          for (int i = 0; i < pixls; i++)              pix0[i] = 0xff000000;            for (int j = 0; j < bits; j++)              bit_f[j] = 0;            isInitialized = true;      }        @Override      protected void doWork(Canvas canvas) {          // TODO Auto-generated method stub          super.doWork(canvas);          if (offImage != null)              canvas.drawBitmap(offImage, drawRect, this.getRect(), mPaint);                }        @Override      protected void change() {          super.change();          if (isInitialized) {              for (int j = 0; j < pixls2; j++) {     //pixls=pixls2                  int k = pix0[j];                  int l = pix0[j + 1];                  int i1 = pix0[j + m_nAppX];                  int j1 = pix0[j + m_nAppX + 1];                  int i = (k & 0xff0000) >> 16;                  int k1 = ((((l & 0xff0000) >> 16) - i) * ru >> 8) + i;                  i = (k & 0xff00) >> 8;                  int l1 = ((((l & 0xff00) >> 8) - i) * ru >> 8) + i;                  i = k & 0xff;                  int i2 = (((l & 0xff) - i) * ru >> 8) + i;                  i = (i1 & 0xff0000) >> 16;                  int j2 = ((((j1 & 0xff0000) >> 16) - i) * ru >> 8) + i;                  i = (i1 & 0xff00) >> 8;                  int k2 = ((((j1 & 0xff00) >> 8) - i) * ru >> 8) + i;                  i = i1 & 0xff;                  int l2 = (((j1 & 0xff) - i) * ru >> 8) + i;                  int i3 = ((j2 - k1) * rv >> 8) + k1;                  int j3 = ((k2 - l1) * rv >> 8) + l1;                  int k3 = ((l2 - i2) * rv >> 8) + i2;                  pix0[j] = i3 << 16 | j3 << 8 | k3 | 0x77000000;                  // if(pix0[j]==0x77000000)pix0[j]=0x55000000;              }                rend();                mCanvas.drawBitmap(pix0, 0, m_nAppX, 0, 0, m_nAppX, m_nAppY, true,mPaint);          }      }        public void dot() {          dot(rand.nextInt(m_nAppX), rand.nextInt(m_nAppY));      }        public void dot(int x, int y) {          m_mouseX = x;          m_mouseY = y;          int k = (int) (rand.nextDouble() * 256D);          int l = (int) (rand.nextDouble() * 256D);          int i1 = (int) (rand.nextDouble() * 256D);          int j1 = k << 16 | l << 8 | i1 | 0xff000000;          int k1 = 0;          for (int l1 = 0; l1 < bits; l1++) {              if (bit_f[l1] != 0)                  continue;              bit_px[l1] = m_mouseX;              bit_py[l1] = m_mouseY;              double d = rand.nextDouble() * 6.2800000000000002D;              double d1 = rand.nextDouble();              bit_vx[l1] = Math.sin(d) * d1;              bit_vy[l1] = Math.cos(d) * d1;              bit_l[l1] = (int) (rand.nextDouble() * 100D) + 100;              bit_p[l1] = (int) (rand.nextDouble() * 3D);              bit_c[l1] = j1;              bit_sx[l1] = m_mouseX;              bit_sy[l1] = m_nAppY - 5;              bit_f[l1] = 2;              if (++k1 == bit_max)                  break;          }      }        void rend() {          boolean flag = false;          boolean flag1 = false;          boolean flag2 = false;          for (int k = 0; k < bits; k++)              switch (bit_f[k]) {                          case 1: // '\001'                  bit_vy[k] += rand.nextDouble() / 50D;                  bit_px[k] += bit_vx[k];                  bit_py[k] += bit_vy[k];                  bit_l[k]--;                  if (bit_l[k] == 0 || bit_px[k] < 0.0D || bit_py[k] < 0.0D                          || bit_px[k] > (double) m_nAppX                          || bit_py[k] > (double) (m_nAppY - 3)) {                      bit_c[k] = 0xff000000;                      bit_f[k] = 0;                  } else if (bit_p[k] == 0) {                      if ((int) (rand.nextDouble() * 2D) == 0)                          bit_set((int) bit_px[k], (int) bit_py[k], -1);                  } else {                      bit_set((int) bit_px[k], (int) bit_py[k], bit_c[k]);                  }                  break;                case 2: // '\002'                  bit_sy[k] -= 5;                  if ((double) bit_sy[k] <= bit_py[k]) {                      bit_f[k] = 1;                      flag2 = true;                  }                  if ((int) (rand.nextDouble() * 20D) == 0) {                      int i = (int) (rand.nextDouble() * 2D);                      int j = (int) (rand.nextDouble() * 5D);                      bit_set(bit_sx[k] + i, bit_sy[k] + j, -1);                  }                  break;              default:                  break;                }    //        if (flag2 && bit_sound > 0)              // sm.playInMediaPlayer(R.raw.firework, null);  //            soundPool.play(id_sound1, 0);      }        void bit_set(int i, int j, int k) {          int l = i + j * m_nAppX;           pix0[l] = k;      }        protected void calculatePerframe() {            try {              Thread.sleep(m_sleepTime);          } catch (InterruptedException e) {              e.printStackTrace();          }      }              @Override      public boolean onTouch(View v, MotionEvent event) {          // return super.onTouch(v, event);          int x = (int) event.getX();          int y = (int) event.getY();          x = x / 2;          y = y / 2;          if (x > m_nAppX)              x = m_nAppX;          if (y > m_nAppY)              y = m_nAppY;          if (x < 0)              x = 0;          if (y < 0)              y = 0;          switch (event.getAction()) {  //        case MotionEvent.ACTION_DOWN:  //  //            break;  //        case MotionEvent.ACTION_UP:  //            this.dot(x, y);  //            if (this.bit_sound > 1)                  // sm.playInMediaPlayer(R.raw.syu, null);  //                soundPool.play(id_sound2, 0);  //         break;          case MotionEvent.ACTION_MOVE:           this.dot(x,y);              break;          }          m_mouseX = x;          m_mouseY = y;          return true;      }  }         package com.lyc;    import android.app.Activity;  import android.os.Bundle;  import android.view.SurfaceView;    public class MainActivity extends Activity {       public void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);  //          setContentView(R.layout.main);           SurfaceView v = new SurfaceView(this);  //         bt1 = (Button) findViewById(R.id.bt1);           HolderSurfaceView.getInstance().setSurfaceView(v);  //         v.setBackgroundResource(R.drawable.mov005);           this.setContentView(v);           final DrawYH yh=new DrawYH();                  v.setOnTouchListener(yh);           yh.begin();             }  }