日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 烟花动画效果图,android利用图片实现烟花效果

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 烟花动画效果图,android利用图片实现烟花效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天突然想做一個煙花播放的效果,用粒子系統來做好像挺麻煩的。想用cocos2d-x,后來想想沒必要,就想做一個自定義view,然后可以添加到程序的任何地方。在網上找了一下資料。正好有人寫了,搞下來覺得不錯,于是便優化一下加點注釋。

工程目錄如下

FireWorkActivity代碼很簡單如下

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;// 當前窗口的大小

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);

}

}

}

關鍵還是看FireworkView這個自定義視圖

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,實現煙花效果

* 創建人:anan

* 創建時間:2012-12-16 下午1:02:36

* 修改人:anan

* 修改時間: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; // 圈數

/**畫面中的煙花數*/

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

* 類描述:重繪線程

* 創建人:anan

* 創建時間:2012-12-16 下午1:06:50

* 修改人:anan

* 修改時間:2012-12-16 下午1:06:50

* 修改備注:

* @version

* */

class MyThread extends Thread {

// 用于控制煙火在空中滯留的時間

int times = 0;

public void run() {

Dot dot = null;

while (running) {

try {

Thread.sleep(100);

} catch (Exception e) {

System.out.println(e);

}

synchronized (lList) {

// 防止畫面的煙花個數多于50個

while (lList.size() > 50) {

System.out.println("當前數目超過50");

for (int i = 0; i < 10; i++) {

lList.remove(i);

}

}

自動添加煙火

//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設置為2

else if (dot.state == 1 && dot.state != 2) {

dot.state = 2;

soundPlay.play(ID_SOUND_BLOW, 0);

} else if (dot.state == 3) {

}

// 規定,每個爆炸點最多是TIME圈,超過就會消失

if (dot.circle >= TIME) {

// 在空中滯留一秒才消失

if (times >= 10) {

dot.state = 4;

times = 0;

} else {

times++;

}

// dot.state = 4;

}

}

}

}

}

}

其他代碼不貼了。其實原理就是用canvas繪制圖片,在煙花上升的時候不斷的切換五張圖片,然后煙花爆炸的時候也切換圖片。整個數據都放到list中維護,用到的無非是基本的2d圖形繪制

效果圖

下載地址

總結

以上是生活随笔為你收集整理的android 烟花动画效果图,android利用图片实现烟花效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。