android小项目打地鼠(二)

本文介绍了程序版本升级至0.4版本后,通过改进逻辑思路,实现点击屏幕响应功能,当点击特定位置时,会触发地鼠出现的交互效果。主要采用线程安全的方法来处理UI更新,确保程序稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   今天写的是程序的0.4版本。实现了点击屏幕的响应。当点击地洞时,会出现地鼠。

   因为不能在子线程里更改View,所以就换了个思路。(参见子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法 . )

   新的逻辑思路是:点击按钮->OnClick()->setMessage()->handleMessage()。因为handler是在主线程生成的,所以不会有问题。

 

 

ActivityMain.java 主函数基本没动,就最后一步设置有变化

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;
	MyHandler myhandler;
  
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        myhandler= new MyHandler(getMainLooper());
        listener=new MyClickListener();
        listener.msg=myhandler.obtainMessage();
        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);
        	
        }
        	//设置为有地鼠出来了,测试用
	    for(int i=0;i<9;i++){
		    Manage.status[i]=1;
	    }	
		
      }
}


Manage.java 添加了两个变量和构造函数,把类的对象存在Manage中,使其他类方便调用。

package com.fsy;
/**
 * 一个管理类,将每个类的对象都传进来,类之间公用数据
 * @author fsy
 *
 */

public class Manage {
	/**
	 * 记录每个鼠洞的状态,0为没出老鼠,1为出来了老鼠
	 */
	static int status[]= new int[9];  //记录每个鼠洞的状态,0为没出老鼠,1为出来了老鼠
	
	static  ActivityMain activitymain= new ActivityMain();
	static MyHandler myhandler=new MyHandler();
	
	Manage(ActivityMain a){
		activitymain=a;
	}
	
	Manage(MyHandler myHandler) {
		myhandler=myHandler;
	}
}

 

 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.myhandler.obtainMessage();
		int status=v.getId();
		switch(status){
		case R.id.image1 :
			if(Manage.status[0] ==1){
				msg.arg1=0;
				Manage.myhandler.sendMessage(msg);
			}
			break;
		case R.id.image2 :
			if(Manage.status[0] ==1){
				msg.arg1=1;
				Manage.myhandler.sendMessage(msg);
			}
			break;
		case R.id.image3 :
			if(Manage.status[0] ==1){
				msg.arg1=2;
				Manage.myhandler.sendMessage(msg);
			}
			break;
		case R.id.image4 :
			if(Manage.status[0] ==1){
				msg.arg1=3;
				Manage.myhandler.sendMessage(msg);
			}
			break;
		case R.id.image5 :
			if(Manage.status[0] ==1){
				msg.arg1=4;
				Manage.myhandler.sendMessage(msg);
			}
			break;
		case R.id.image6 :
			if(Manage.status[0] ==1){
				msg.arg1=5;
				Manage.myhandler.sendMessage(msg);
			}
			break;
		case R.id.image7 :
			if(Manage.status[0] ==1){
				msg.arg1=6;
				Manage.myhandler.sendMessage(msg);
			}
			break;
		case R.id.image8 :
			if(Manage.status[0] ==1){
				msg.arg1=7;
				Manage.myhandler.sendMessage(msg);
			}
			break;
		case R.id.image9 :
			if(Manage.status[0] ==1){
				msg.arg1=8;
				Manage.myhandler.sendMessage(msg);
			}
			break;				
		}
	}
}


MyHandler.java 消息接收器。
 

package com.fsy;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;


public class MyHandler extends Handler{
	Manage manage;
	int index;
	public MyHandler(Looper looper) {
		super(looper);
		manage=new Manage(this);
	}
	public MyHandler() {
		super();
	}
	@Override
	public void handleMessage(Message msg) {
		index=msg.arg1;
		Manage.activitymain.b[index].setImageResource(R.drawable.hitted);
	}	
}

 


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值