android 烟花动画效果图,android利用图片实现烟花效果
今天突然想做一個(gè)煙花播放的效果,用粒子系統(tǒng)來(lái)做好像挺麻煩的。想用cocos2d-x,后來(lái)想想沒(méi)必要,就想做一個(gè)自定義view,然后可以添加到程序的任何地方。在網(wǎng)上找了一下資料。正好有人寫了,搞下來(lái)覺(jué)得不錯(cuò),于是便優(yōu)化一下加點(diǎn)注釋。
工程目錄如下
FireWorkActivity代碼很簡(jiǎn)單如下
package com.firework;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import com.fireview.FireworkView;
public class FireWorkActivity extends Activity {
/** Called when the activity is first created. */
// EventListener mListener = new EventListener();
static final String LOG_TAG = FireWorkActivity.class.getSimpleName();
static int SCREEN_W = 480;// 當(dāng)前窗口的大小
static int SCREEN_H = 854;
FireworkView fireworkView;
// get the current looper (from your Activity UI thread for instance
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//}
fireworkView = new FireworkView(this);
setContentView(fireworkView);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if (fireworkView.isRunning()) {
fireworkView.setRunning(false);
}
}
}
關(guān)鍵還是看FireworkView這個(gè)自定義視圖
package com.fireview;
import java.io.InputStream;
import java.util.Vector;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.view.MotionEvent;
import android.view.View;
import com.dot.Dot;
import com.dot.DotFactory;
import com.dot.LittleDot;
import com.firework.R;
/**
* 類名稱:FireworkView
* 類描述:繼承android的View,實(shí)現(xiàn)煙花效果
* 創(chuàng)建人:anan
* 創(chuàng)建時(shí)間:2012-12-16 下午1:02:36
* 修改人:anan
* 修改時(shí)間:2012-12-16 下午1:02:36
* 修改備注:
* @version
* */
public class FireworkView extends View {
final String LOG_TAG = FireworkView.class.getSimpleName();
public static final int ID_SOUND_UP = 0;
public static final int ID_SOUND_BLOW = 1;
public static final int ID_SOUND_MULTIPLE = 2;
final static int TIME = 5; // 圈數(shù)
/**畫面中的煙花數(shù)*/
private Vector lList = new Vector();
LittleDot[] ld = new LittleDot[200];
private DotFactory df = null;
boolean running = true;
Bitmap backGroundBitmap;
Context mContext;
public static SoundPlay soundPlay;
public FireworkView(Context context) {
super(context);
df = new DotFactory();
new MyThread().start();
mContext = context;
backGroundBitmap = ReadBitMap(mContext, R.drawable.night);
backGroundBitmap = resizeImage(backGroundBitmap, 480, 800);
initSound(mContext);
}
public static void initSound(Context context) {
soundPlay = new SoundPlay();
soundPlay.initSounds(context);
soundPlay.loadSfx(context, R.raw.up, ID_SOUND_UP);
soundPlay.loadSfx(context, R.raw.blow, ID_SOUND_BLOW);
soundPlay.loadSfx(context, R.raw.multiple, ID_SOUND_MULTIPLE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(backGroundBitmap, 0, 0, null);
synchronized (lList) {
for (int i = 0; i < lList.size(); i++) {
lList.get(i).myPaint(canvas, lList);
}
}
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Dot dot = null;
int rand = (int) (Math.random() * 99);
dot = df.makeDot(mContext, rand, (int) event.getX(),(int) event.getY());
synchronized (lList) {
lList.add(dot);
soundPlay.play(ID_SOUND_UP, 0);
}
}
return super.onTouchEvent(event);
}
public boolean isRunning() {
return running;
}
public void setRunning(boolean running) {
this.running = running;
}
public Bitmap ReadBitMap(Context context, int resId) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
// 獲取資源圖片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}
public Bitmap resizeImage(Bitmap mBitmap, int w, int h) {
Bitmap BitmapOrg = mBitmap;
int width = BitmapOrg.getWidth();
int height = BitmapOrg.getHeight();
int newWidth = w;
int newHeight = h;
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap tmp = Bitmap.createBitmap(BitmapOrg, 0, 0, width, height,
matrix, true);
return tmp;
}
/**
* 類名稱:MyThread
* 類描述:重繪線程
* 創(chuàng)建人:anan
* 創(chuàng)建時(shí)間:2012-12-16 下午1:06:50
* 修改人:anan
* 修改時(shí)間:2012-12-16 下午1:06:50
* 修改備注:
* @version
* */
class MyThread extends Thread {
// 用于控制煙火在空中滯留的時(shí)間
int times = 0;
public void run() {
Dot dot = null;
while (running) {
try {
Thread.sleep(100);
} catch (Exception e) {
System.out.println(e);
}
synchronized (lList) {
// 防止畫面的煙花個(gè)數(shù)多于50個(gè)
while (lList.size() > 50) {
System.out.println("當(dāng)前數(shù)目超過(guò)50");
for (int i = 0; i < 10; i++) {
lList.remove(i);
}
}
自動(dòng)添加煙火
//if (lList.size() <= 2) {
//Dot tmp = null;
//int rand = (int) (Math.random() * 99);
//Random random = new Random();
//tmp = df.makeDot(mContext, rand, random.nextInt(480),
//50 + random.nextInt(300));
//lList.add(tmp);
//}
}
for (int i = 0; i < lList.size(); i++) {
dot = (Dot) lList.get(i);
if (dot.state == 1 && !dot.whetherBlast()) {
dot.rise();
}
// 如果是whetherBlast()返回的是true,那么就把該dot的state設(shè)置為2
else if (dot.state == 1 && dot.state != 2) {
dot.state = 2;
soundPlay.play(ID_SOUND_BLOW, 0);
} else if (dot.state == 3) {
}
// 規(guī)定,每個(gè)爆炸點(diǎn)最多是TIME圈,超過(guò)就會(huì)消失
if (dot.circle >= TIME) {
// 在空中滯留一秒才消失
if (times >= 10) {
dot.state = 4;
times = 0;
} else {
times++;
}
// dot.state = 4;
}
}
}
}
}
}
其他代碼不貼了。其實(shí)原理就是用canvas繪制圖片,在煙花上升的時(shí)候不斷的切換五張圖片,然后煙花爆炸的時(shí)候也切換圖片。整個(gè)數(shù)據(jù)都放到list中維護(hù),用到的無(wú)非是基本的2d圖形繪制
效果圖
下載地址
總結(jié)
以上是生活随笔為你收集整理的android 烟花动画效果图,android利用图片实现烟花效果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何正确修改标题,如何修改标题不会被降权
- 下一篇: 前后端分离实现文件下载功能