android小项目打地鼠(三)
2011-09-29 21:07
295 查看
今天空闲时间比较多,写了两个版本。0.5版本处理的是随机产生地鼠。0.6版本处理的是地鼠的消失。这个地鼠还真就不太好打,图都不好截
。
有这样一个事非常的讨厌,handler的线程不能调用sleep方法,因为属于主线程,调用就不动了......所以延迟消息的执行就要另起一个线程,sleep,然后再回调。 幸好Message还有个what变量,要不得闹死了~
ActivityMain.java 主Activity
BackHandler.java
BlackHole.java
HitHandler.java
MakeMouse.java
Manage.java
MyClickListener.java
sendHanlder.java
Main.xml 没改,就不贴了。想看的话,可以看
android小项目打地鼠(一)
。
有这样一个事非常的讨厌,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小项目打地鼠(一)
相关文章推荐
- android小项目打地鼠(四)
- android小项目打地鼠(二)
- android小项目打地鼠(五)
- android小项目打地鼠(一)
- 直接拿来用!最火的Android开源项目(完结篇)
- 在eclipse中将android项目生成apk并且给apk签名
- 直接拿来用!最火的Android开源项目(一)
- 使用Ant批量打包Android项目
- 只有被测APK时运行Robotium测试项目Logcat报错“Could not find class 'com.jayway.android.robotium.solo.Solo'"
- 带你玩转Eclipse项目转成AndroidStudio项目
- Android项目新架构(1)—————RxJava
- Gradle命令编译Android项目
- Eclipse中Android项目引用其他项目时链接源码的方法
- 高手速成android开源项目【导航篇】
- android项目不能生成R文件
- Android git版本控制与项目提交到github
- Android项目实战之战途牛
- intellij idea创建完android项目编译的时候报错。之前都没事的
- 【Android 项目构建】Git版本控制实战
- 【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例