首先說明一點,這個例子有個致命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++;
}
}
};
}
調試截圖:
注:黑色那個是選中的數字,淡一點的會像水果機一樣一直轉動,最後停在某個數上,如果與選中的數一樣就會顯示中獎。