您的位置:首页 > 移动开发 > Android开发

android小项目打地鼠(三)

2011-09-29 21:07 295 查看
今天空闲时间比较多,写了两个版本。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小项目打地鼠(一)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: