Handler实例之打地鼠小游戏
Step 1 创建布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DiglettActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/diglett"
android:id="@+id/image_diglett"
android:visibility="gone"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:id="@+id/start_diglett_btn"
android:text="@string/start_game"
/>
<TextView
android:id="@+id/result_diglett_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
/>
</RelativeLayout>
Step 2 初始化控件及准备数据
private TextView mResultTextView;
private ImageView mDiglettImageView;
private Button mStartButton;
public int[][] mPosition = new int[][]{
{342, 180},{432, 880},
{521, 256},{429, 780},
{456, 976},{145, 665},
{123, 678},{564, 567},
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diglett);
findViews();
setListeners();
}
private void setListeners() {
mStartButton.setOnClickListener(this);
}
private void findViews() {
mDiglettImageView=findViewById(R.id.image_diglett);
mStartButton = findViewById(R.id.start_diglett_btn);;
mResultTextView = findViewById(R.id.result_diglett_txt);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.start_diglett_btn:
//开始游戏的操作
start()
...
break;
}
}
Step 3 新建一个Handler类
//新建一个Handler类
public static class DiglettHandler extends Handler {
public final WeakReference<DiglettActivity> diglettActivityWeakReference;
public DiglettHandler(DiglettActivity activity) {
this.diglettActivityWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//获取DiglettActivity
DiglettActivity activity = diglettActivityWeakReference.get();
//处理数据
...
}
}
Step 4 开始游戏的操作
private void start() {
mStartButton.setText("游戏中");
mStartButton.setEnabled(false);
mResultTextView.setText("开始啦");
next(500);
}
private void next(int delayTime) {
int position = new Random().nextInt(mPosition.length);
Message message = Message.obtain();
message.what = CODE;
message.arg1 = position;
handler.sendMessageDelayed(message,delayTime);
//每打一个地鼠 增加1
mTotalCount++;
}
Step 5 handler处理数据
//处理数据
switch (msg.what){
case CODE:
if(activity.mTotalCount>MAX_COUNT){
activity.clear();
Toast.makeText(activity,"地鼠打完了!",Toast.LENGTH_SHORT).show();
break;
}
int position = msg.arg1;
activity.mDiglettImageView.setX(activity.mPosition[position][0]);
activity.mDiglettImageView.setX(activity.mPosition[position][1]);
activity.mDiglettImageView.setVisibility(View.VISIBLE);
int random = new Random().nextInt(RANDOM_NUMBER)+activity.RANDOM_NUMBER;
activity.next(random);
break;
}
Step 6 处理打地鼠的操作
实现OnTouchListener接口
public class DiglettActivity extends AppCompatActivity implements View.OnClickListener,View.OnTouchListener {
...
@Override
public boolean onTouch(View v, MotionEvent event) {
v.setVisibility(View.GONE);
mSuccessCount++;
mResultTextView.setText("打到了:"+mSuccessCount+"只,共"+MAX_COUNT+"只。");
return false;
}
//清空操作
private void clear() {
mTotalCount = 0;
mSuccessCount = 0;
mDiglettImageView.setVisibility(View.GONE);
mStartButton.setText("点击开始");
mStartButton.setEnabled(true);
}
}