今天空闲时间比较多,写了两个版本。0.5版本处理的是随机产生地鼠。0.6版本处理的是地鼠的消失。这个地鼠还真就不太好打,图都不好截 。
有这样一个事非常的讨厌,handler的线程不能调用sleep方法,因为属于主线程,调用就不动了......所以延迟消息的执行就要另起一个线程,sleep,然后再回调。 幸好Message还有个what变量,要不得闹死了~
ActivityMain.java 主Activity
package com.fsy;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageButton;
/**
* 主Activity
* @author fsy
*
*/
public class ActivityMain extends Activity {
ImageButton b[];
Manage manage ;
MyClickListener listener;
HitHandler hithandler;
SetHandler sethandler;
BackHandler backhandler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sethandler= new SetHandler(getMainLooper());
hithandler= new HitHandler(getMainLooper());
backhandler= new BackHandler(getMainLooper());
listener=new MyClickListener();
manage = new Manage(ActivityMain.this);
b=new ImageButton[9];
b[0]=(ImageButton)findViewById(R.id.image1);
b[1]=(ImageButton)findViewById(R.id.image2);
b[2]=(ImageButton)findViewById(R.id.image3);
b[3]=(ImageButton)findViewById(R.id.image4);
b[4]=(ImageButton)findViewById(R.id.image5);
b[5]=(ImageButton)findViewById(R.id.image6);
b[6]=(ImageButton)findViewById(R.id.image7);
b[7]=(ImageButton)findViewById(R.id.image8);
b[8]=(ImageButton)findViewById(R.id.image9);
for(int i=0;i<9;i++){
b[i].setOnClickListener(listener);
}
MakeMouse makemouse = new MakeMouse();
Thread t = new Thread(makemouse);
t.start();
}
}
BackHandler.java
package com.fsy;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
/**
* 处理地鼠回洞的Handler
* @author fsy
* @notice
* 有这样一个事非常的讨厌,handler的线程不能调用sleep方法,因为属于主线程
* 所以延迟消息的执行就要另起一个线程,sleep,然后再回调。
* 幸好Message还有个what变量,要不得闹死了~
*/
public class BackHandler extends Handler{
BackHole backhole;
public BackHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
int index=msg.arg1;
int is_hitted=msg.arg2;
if(msg.what == 0){ //判断是否为第一次执行
backhole = new BackHole(index,is_hitted);
Thread t = new Thread(backhole);
t.start();
}else{
Manage.activitymain.b[index].setImageResource(R.drawable.ready);
Manage.status[index]=0;
}
}
}
BlackHole.java
package com.fsy;
import android.os.Message;
/**
* 处理地鼠回洞延迟,实现了Runnable
* @author fsy
*
*/
public class BackHole implements Runnable{
int index;
int is_hitted;
public BackHole(int i,int is) {
super();
index =i;
is_hitted = is;
}
@Override
public void run() {
Message msg = Manage.activitymain.backhandler.obtainMessage();
try {
if(is_hitted == 1){
Thread.sleep(Manage.confused_time);
}else{
Thread.sleep(Manage.stay_time);
}
msg.arg1=index;
msg.arg2=is_hitted;
msg.what=1; //第二次访问
Manage.activitymain.backhandler.sendMessage(msg);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
HitHandler.java
package com.fsy;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
public class HitHandler extends Handler{
public HitHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
Message back_msg= Manage.activitymain.backhandler.obtainMessage();
int index=msg.arg1;
back_msg.arg1 = msg.arg1;
back_msg.arg2 = 1; //标记是否打到地鼠,打到地鼠为1
back_msg.what = 0; //设定第一次调用
Manage.activitymain.b[index].setImageResource(R.drawable.hitted);
Manage.activitymain.backhandler.sendMessage(back_msg);
}
}
MakeMouse.java
package com.fsy;
import java.util.Random;
import android.os.Message;
/**
* 产生地鼠,是Runnable的子类
* @author fsy
*
*/
public class MakeMouse implements Runnable{
Random ran ;
int temp;
@Override
public void run() {
ran = new Random();
while(true){
int temp;
Message msg1=Manage.activitymain.sethandler.obtainMessage();
temp=ran.nextInt(9);
msg1.arg1=temp;
Manage.activitymain.sethandler.sendMessage(msg1);
try {
Thread.sleep(Manage.make_time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Manage.java
package com.fsy;
/**
* 一个管理类,将每个类的对象都传进来,类之间公用数据
* @author fsy
*
*/
public class Manage {
/**
* 记录每个鼠洞的状态,0为没出老鼠,1为出来了老鼠
*/
static int status[]= new int[9]; //记录每个鼠洞的状态,0为没出老鼠,1为出来了老鼠
/**
* 地鼠的停留时间,单位毫秒
*/
static int stay_time = 2000;
/**
* 产生新地鼠的时间,单位毫秒
*/
static int make_time = 500;
/**
* 被打晕的停留时间,单位毫秒
*/
static int confused_time = 500;
static ActivityMain activitymain= new ActivityMain();
static MakeMouse makemouse ;
Manage(ActivityMain a){
activitymain=a;
}
Manage(MakeMouse t){
makemouse=t;
}
}
MyClickListener.java
package com.fsy;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
/**
*ImageButton的Listener 处理点击后的响应
* @author fsy
*
*/
public class MyClickListener implements OnClickListener{
Manage manage;
Message msg;
@Override
public void onClick(View v) {
//每一次必须新生成一个Message,因为mgs还在消息队列中
msg=Manage.activitymain.hithandler.obtainMessage();
int status=v.getId();
switch(status){
case R.id.image1 :
if(Manage.status[0] ==1){
msg.arg1=0;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
case R.id.image2 :
if(Manage.status[1] ==1){
msg.arg1=1;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
case R.id.image3 :
if(Manage.status[2] ==1){
msg.arg1=2;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
case R.id.image4 :
if(Manage.status[3] ==1){
msg.arg1=3;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
case R.id.image5 :
if(Manage.status[4] ==1){
msg.arg1=4;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
case R.id.image6 :
if(Manage.status[5] ==1){
msg.arg1=5;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
case R.id.image7 :
if(Manage.status[6] ==1){
msg.arg1=6;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
case R.id.image8 :
if(Manage.status[7] ==1){
msg.arg1=7;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
case R.id.image9 :
if(Manage.status[8] ==1){
msg.arg1=8;
Manage.activitymain.hithandler.sendMessage(msg);
}
break;
}
}
}
sendHanlder.java
package com.fsy;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
/**
* 设定地鼠的消息接收类
* @author fsy
*
*/
public class SetHandler extends Handler{
public SetHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
Message back_msg= Manage.activitymain.backhandler.obtainMessage();
int index=msg.arg1;
back_msg.arg1 = msg.arg1;
back_msg.arg2 = 0; //标记是否打到地鼠,打到地鼠为0
back_msg.what = 0;
if(Manage.status[index] == 0){
Manage.activitymain.b[index].setImageResource(R.drawable.surprise);
Manage.status[index]=1;
Manage.activitymain.backhandler.sendMessage(back_msg);
}
}
}
Main.xml 没改,就不贴了。想看的话,可以看 android小项目打地鼠(一)