首先说明一点,这个例子有个致命bug,是写到后面才发现的,就是快速连续点“start”和“stop”按钮会出错,因为用的handler,所以会不断开启线程,后来也想了一些办法来补救,但是还是不能让自己满意。于是只能就此作罢。不过,其他地方都是还不错的。
主要用的知识点:1.handler。2.自定义按钮
三个按钮的布局:
在res下drawable文件夹(如没有这个文件夹,就新建)创建xml文件,选layer-list。
button_false.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape>
<solid android:color="#ffffff" />
</shape>
</item>
<item
android:bottom="5dp"
android:right="5dp"
android:left="5dp"
android:top="5dp"
>
<shape>
<solid android:color="#c0c0c0" />
</shape>
</item>
</layer-list>
button_true.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape>
<solid android:color="#ffffff" />
</shape>
</item>
<item
android:bottom="5dp"
android:right="5dp"
android:left="5dp"
android:top="5dp"
>
<shape>
<solid android:color="#808a87" />
</shape>
</item>
</layer-list>
button_select.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape>
<solid android:color="#ffffff" />
</shape>
</item>
<item
android:bottom="5dp"
android:right="5dp"
android:left="5dp"
android:top="5dp"
>
<shape>
<solid android:color="#292421" />
</shape>
</item>
</layer-list>
MainActivity
package com.example.demo06;
import java.util.Random;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
LinearLayout layout_main, layout_01, layout_02;
// 建立按钮数组,用来存储用到的对象
Button bs[] = new Button[10];
// 实例化随机数对象
Random r = new Random();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
// 初始化背景布局
layout_main = new LinearLayout(this);
layout_main.setOrientation(LinearLayout.VERTICAL);
setContentView(layout_main);
// 初始化子布局
layout_01 = new LinearLayout(this);
layout_02 = new LinearLayout(this);
// 设置排列方向
layout_01.setOrientation(LinearLayout.HORIZONTAL);
layout_02.setOrientation(LinearLayout.HORIZONTAL);
layout_01.setPadding(5, 5, 5, 0);
layout_02.setPadding(5, 0, 5, 5);
// 获取屏幕的长宽
DisplayMetrics om = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(om);
int width = om.widthPixels;
int height = om.heightPixels;
// 生成所有按钮
for (int i = 0; i < 10; i++) {
Button b = new Button(this);
b.setWidth((width - 10) / 5);
b.setHeight(height / 7);
b.setText(i + "");
b.setBackgroundResource(R.drawable.button_false);
b.setTag(false);
b.setId(i);
b.setOnClickListener(this);
bs[i] = b;
}
// 把按钮添加到子布局中
for (int i = 0; i < 10; i++) {
if (i < 5) {
layout_01.addView(bs[i]);
} else {
layout_02.addView(bs[14 - i]);
}
}
// 设置子布局添加到主布局中
layout_main.addView(layout_01);
layout_main.addView(layout_02);
// 生成开始按钮
Button b_start = new Button(this);
b_start.setText("start");
b_start.setId(11);
b_start.setTag(false);
b_start.setBackgroundResource(R.drawable.button_false);
b_start.setHeight(height / 7);
b_start.setOnClickListener(this);
layout_main.addView(b_start);
}
// 定义下面要用到的参数
private int num = -1, flag = 0, sysnum = -1;
// ************所有的按钮点击**************
@Override
public void onClick(View arg0) {
// *************点击了数字按钮***************
if (arg0.getId() < 10) {
// 系统运行时sysnum = -2
if (sysnum == -2) {
Toast.makeText(getApplication(), "运行时不可选择!", Toast.LENGTH_SHORT)
.show();
return;
}
// 为了退出中奖循环,只要sysnum<0即可退出中奖循环
sysnum = -3;
if ((Boolean) arg0.getTag()) {
arg0.setTag(false);
arg0.setBackgroundResource(R.drawable.button_false);
((TextView) arg0).setTextColor(Color.BLACK);
num = -1;
} else {
if (num > -1) {
bs[num].setTag(false);
bs[num].setBackgroundResource(R.drawable.button_false);
bs[num].setTextColor(Color.BLACK);
}
arg0.setTag(true);
arg0.setBackgroundResource(R.drawable.button_select);
((TextView) arg0).setTextColor(Color.WHITE);
num = arg0.getId();
}
// *********点击了开始和停止按钮********
} else {
// 在开始时必须要选一个数字
if (num == -1) {
Toast.makeText(getApplication(), "请选择一个数字!", Toast.LENGTH_SHORT)
.show();
return;
}
// --------点击了开始--------
if (!(Boolean) arg0.getTag()) {
// 将开始按钮的文字改为“stop”
((TextView) arg0).setText("stop");
// 将系统生成值初始化
sysnum = -2;
// 每次都从 0 开始
if (flag > 0 && num != (flag - 1)) {
bs[flag - 1].setBackgroundResource(R.drawable.button_false);
} else if (flag == 0 && num != (flag - 1)) {
bs[0].setBackgroundResource(R.drawable.button_false);
} else {
bs[num].setBackgroundResource(R.drawable.button_select);
}
// 将循环的开始数定为0
flag = 0;
// 将按钮值转为 true
arg0.setTag(true);
// 开启子线程开始发送消息
new Thread() {
public void run() {
while (true) {
// 判断系统生成的数字,点stop之前是-1
if (sysnum == bs[flag].getId()) {
// 中奖循环
if (num == sysnum) {
for (int i = 0; sysnum > 0; i++) {
handler.sendEmptyMessage(2 + i);
try {
// 休息0.5秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
sysnum = -1;
break;
}
try {
// 休息0.1秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 发送空消息
handler.sendEmptyMessage(0);
}
}
}.start();
// --------点击了停止-------
} else {
((TextView) arg0).setText("start");
// 产生随机数
sysnum = r.nextInt(10);
arg0.setTag(false);
}
}
}
// 实例化handler
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what > 1) {
if (msg.what == 3)
Toast.makeText(getBaseContext(), "中奖了", Toast.LENGTH_SHORT)
.show();
if (msg.what % 2 == 0) {
bs[num].setBackgroundResource(R.drawable.button_select);
} else {
bs[num].setBackgroundResource(R.drawable.button_true);
}
} else {
// ------分两种情况,1.循环到0时,2.不是0时
// ---------1.当循环到0时-------------
if (flag == 0) {
// 所处的那个按钮的颜色
if (num == 0) {
bs[flag].setBackgroundResource(R.drawable.button_select);
} else {
bs[flag].setBackgroundResource(R.drawable.button_true);
}
// 所处的按钮后一个按钮的颜色
if (num == 9) {
bs[9].setBackgroundResource(R.drawable.button_select);
} else {
bs[9].setBackgroundResource(R.drawable.button_false);
}
// ---------当循环到非0时-----------
} else {
// 所处的那个按钮的颜色
if (num == flag) {
bs[flag].setBackgroundResource(R.drawable.button_select);
} else {
bs[flag].setBackgroundResource(R.drawable.button_true);
}
// 所处的按钮后一个按钮的颜色
if (num == (flag - 1)) {
bs[flag - 1]
.setBackgroundResource(R.drawable.button_select);
} else {
bs[flag - 1]
.setBackgroundResource(R.drawable.button_false);
}
}
// 当计数到9时归零再次循环,因为下面要++,所以为-1
if (flag == 9) {
flag = -1;
}
flag++;
}
}
};
}
调试截图:
注:黑色那个是选中的数字,淡一点的会像水果机一样一直转动,最后停在某个数上,如果与选中的数一样就会显示中奖。