上周买了个HTC G6,终于换掉了用了3年5个月的索爱w710c。为了平时给自己写一些比较实用的应用工具,于是便开始学习Android编程的相关知识。折腾了快一周吧,从学习搭环境到开发,虽然也遇到些让人纠结的问题,还好都一一解决了。言归正转,这次写的是一个Demo似的小应用,简单得不能再简单了,一共就三个类,主类Bubble继承于Activity,然后就是Vacuole和Sound类,分别是泡泡对象和声音的处理,类图如下:
以下是具体的代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package randork.game;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TableLayout;
import android.widget.TableRow;
import randork.game.Sound;
import randork.game.Vacuole;
public class Bubble extends Activity {
private int cellCount=7;
private int rowCount=9;
private Vacuole[] vcl=new Vacuole[cellCount * rowCount];
private TableRow[] rows=new TableRow[rowCount];
private Sound sound;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stage);
sound=new Sound(this);
initRender();
}
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0,0,0,"重玩");
menu.add(0,1,1,"关于...");
menu.add(0,2,2,"退出");
return result;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
reset();
return false;
case 1:
about();
return false;
case 2:
destory();
return false;
default:
return false;
}
}
public void onBackPressed(){
destory();
super.onBackPressed();
}
/**
* 重新开始
*/
public void reset(){
int i,l=vcl.length;
for(i=0;i<l;i++){
vcl[i].reset();
}
}
/**
* 销毁对象,释放资源
*/
public void destory(){
sound.destroy();
this.finish();
}
/**
* 初始化每一行的泡泡
*/
private void initRows(){
int i,l=rowCount;
TableLayout container=(TableLayout)findViewById(R.id.container2);
for(i=0;i<l;i++){
rows[i]=new TableRow(this);
container.addView(rows[i]);
}
}
/**
* 初始化内容的呈现
*/
private void initRender(){
int cr,i,l=vcl.length;
initRows();
for(i=0;i<l;i++){
cr=(int)Math.ceil(i/cellCount);
vcl[i]=new Vacuole(this,sound);
rows[cr].addView(vcl[i].renderer, 46, 46);
}
}
/**
* about对话框的定义
*/
private void about(){
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.about);
dialog.setTitle("随机出品");
dialog.show();
}
}
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TableLayout;
import android.widget.TableRow;
import randork.game.Sound;
import randork.game.Vacuole;
public class Bubble extends Activity {
private int cellCount=7;
private int rowCount=9;
private Vacuole[] vcl=new Vacuole[cellCount * rowCount];
private TableRow[] rows=new TableRow[rowCount];
private Sound sound;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stage);
sound=new Sound(this);
initRender();
}
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0,0,0,"重玩");
menu.add(0,1,1,"关于...");
menu.add(0,2,2,"退出");
return result;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
reset();
return false;
case 1:
about();
return false;
case 2:
destory();
return false;
default:
return false;
}
}
public void onBackPressed(){
destory();
super.onBackPressed();
}
/**
* 重新开始
*/
public void reset(){
int i,l=vcl.length;
for(i=0;i<l;i++){
vcl[i].reset();
}
}
/**
* 销毁对象,释放资源
*/
public void destory(){
sound.destroy();
this.finish();
}
/**
* 初始化每一行的泡泡
*/
private void initRows(){
int i,l=rowCount;
TableLayout container=(TableLayout)findViewById(R.id.container2);
for(i=0;i<l;i++){
rows[i]=new TableRow(this);
container.addView(rows[i]);
}
}
/**
* 初始化内容的呈现
*/
private void initRender(){
int cr,i,l=vcl.length;
initRows();
for(i=0;i<l;i++){
cr=(int)Math.ceil(i/cellCount);
vcl[i]=new Vacuole(this,sound);
rows[cr].addView(vcl[i].renderer, 46, 46);
}
}
/**
* about对话框的定义
*/
private void about(){
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.about);
dialog.setTitle("随机出品");
dialog.show();
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package randork.game;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import randork.game.Sound;
public class Vacuole {
public ImageView renderer;
public boolean isBombed=false;
private int idx=(int)Math.ceil(Math.random()*6)-1;
private Context context;
private Sound sound;
/**
* 定义点击的事件
*/
private OnTouchListener mCorkyListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){
bomb();
}
return false;
}
};
/**
* 爆炸后的泡泡图片资源
*/
private int intBombImages[]={
R.drawable.bomb1,
R.drawable.bomb2,
R.drawable.bomb3,
R.drawable.bomb4,
R.drawable.bomb5,
R.drawable.bomb6
};
public Vacuole(Context c,Sound sd){
context=c;
sound=sd;
initRenderer();
}
/**
* 泡泡爆炸,会随机地显示一个资源中的爆炸后的图片,并播放声音
*/
public void bomb(){
if(isBombed){
return;
}
renderer.setImageResource(intBombImages[idx]);
sound.play();
isBombed=true;
}
/**
* 重新开始
*/
public void reset(){
isBombed=false;
renderer.setImageResource(R.drawable.normal);
}
/**
* 初始化泡泡图形的呈现
*/
private void initRenderer(){
renderer=new ImageView(context);
renderer.setPadding(2, 2, 2, 2);
renderer.setImageResource(R.drawable.normal);
renderer.setOnTouchListener(mCorkyListener);
}
}
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import randork.game.Sound;
public class Vacuole {
public ImageView renderer;
public boolean isBombed=false;
private int idx=(int)Math.ceil(Math.random()*6)-1;
private Context context;
private Sound sound;
/**
* 定义点击的事件
*/
private OnTouchListener mCorkyListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){
bomb();
}
return false;
}
};
/**
* 爆炸后的泡泡图片资源
*/
private int intBombImages[]={
R.drawable.bomb1,
R.drawable.bomb2,
R.drawable.bomb3,
R.drawable.bomb4,
R.drawable.bomb5,
R.drawable.bomb6
};
public Vacuole(Context c,Sound sd){
context=c;
sound=sd;
initRenderer();
}
/**
* 泡泡爆炸,会随机地显示一个资源中的爆炸后的图片,并播放声音
*/
public void bomb(){
if(isBombed){
return;
}
renderer.setImageResource(intBombImages[idx]);
sound.play();
isBombed=true;
}
/**
* 重新开始
*/
public void reset(){
isBombed=false;
renderer.setImageResource(R.drawable.normal);
}
/**
* 初始化泡泡图形的呈现
*/
private void initRenderer(){
renderer=new ImageView(context);
renderer.setPadding(2, 2, 2, 2);
renderer.setImageResource(R.drawable.normal);
renderer.setOnTouchListener(mCorkyListener);
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package randork.game;
import android.content.Context;
import android.media.MediaPlayer;
public class Sound {
private MediaPlayer mPlayers[]=new MediaPlayer[6];
private Context context;
public Sound(Context c){
context=c;
initMPlayers();
}
/**
* 随机播放一个爆炸的声音
*/
public void play(){
int idx=(int)Math.ceil(Math.random()*6)-1;
mPlayers[idx].start();
}
/**
* 释放mPlayer
*/
public void destroy(){
int i,l=mPlayers.length;
for(i=0;i<l;i++){
mPlayers[i].release();
}
}
/**
* 初始化播放声音对象数组
*/
private void initMPlayers(){
mPlayers[0]=MediaPlayer.create(context,R.raw.sound1);
mPlayers[1]=MediaPlayer.create(context,R.raw.sound2);
mPlayers[2]=MediaPlayer.create(context,R.raw.sound3);
mPlayers[3]=MediaPlayer.create(context,R.raw.sound4);
mPlayers[4]=MediaPlayer.create(context,R.raw.sound5);
mPlayers[5]=MediaPlayer.create(context,R.raw.sound6);
}
}
import android.content.Context;
import android.media.MediaPlayer;
public class Sound {
private MediaPlayer mPlayers[]=new MediaPlayer[6];
private Context context;
public Sound(Context c){
context=c;
initMPlayers();
}
/**
* 随机播放一个爆炸的声音
*/
public void play(){
int idx=(int)Math.ceil(Math.random()*6)-1;
mPlayers[idx].start();
}
/**
* 释放mPlayer
*/
public void destroy(){
int i,l=mPlayers.length;
for(i=0;i<l;i++){
mPlayers[i].release();
}
}
/**
* 初始化播放声音对象数组
*/
private void initMPlayers(){
mPlayers[0]=MediaPlayer.create(context,R.raw.sound1);
mPlayers[1]=MediaPlayer.create(context,R.raw.sound2);
mPlayers[2]=MediaPlayer.create(context,R.raw.sound3);
mPlayers[3]=MediaPlayer.create(context,R.raw.sound4);
mPlayers[4]=MediaPlayer.create(context,R.raw.sound5);
mPlayers[5]=MediaPlayer.create(context,R.raw.sound6);
}
}
这是程序运行界面
这篇博文只是说明了一个应用,并不是讲解Android开发的基本原理,Android开发的相关还是建议大家看http://developer.android.com/的(需要FQ过去。。- -!),我这里只是做了一个小应用,希望对一些像我这样刚入门的同学能有一些帮助。
这里再把编译好的apk和源代码提供下载: