|
使用风格
在我们的扫雷游戏里,点击新游戏的笑脸按钮会让这个笑脸变成紧张的表情。当按钮处于按压状态时(紧张的笑脸),我们需要一个不同的图像。当它处于正常状态时需要另一张图像。为了实现此功能,我们使用风格,效果如下:
使用风格也需要两步:
1.创建一个XML文件(风格定义文件),指定相应的按钮状态使用的图片.比如在按压状态下,我们需要惊讶(紧张)的图片,正常状态下需要微笑的图片.当然,这两幅图片已经复制到 res/drawable文件夹中了.风格文件的代码如下:
java代码:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"
android:state_pressed="false"
android:drawable="@drawable/smile" />
<item android:state_focused="true"
android:state_pressed="true"
android:drawable="@drawable/surprise" />
<item android:state_focused="false"
android:state_pressed="true"
android:drawable="@drawable/surprise" />
<item android:drawable="@drawable/smile" />
</selector>
复制代码
1.为新游戏按钮更新/添加背景的属性值,将它的值设定为上面创建的风格文件。更新后的ImageButton代码如下:
java代码:
<ImageButton android:id="@+id/Smiley"
android:layout_column="1"
android:background="@drawable/smiley_button_states"
android:layout_height="48px"/>
复制代码
TableLayout中的动态行
动态添加砖块的原理相同(砖块是从按钮类继承的类,包含支持实现的额外功能).我们希望它们像预想的那样工作,分为如下的几步:
1.创建一个TableRow对象,设置布局的参数值.
2.将砖块添加到上面创建的行对象中.
3.使用 findViewById 函数获得TableLayout(雷区)的样本.
4.将上边创建的行添加到TableLayout中
java代码:
private TableLayout mineField; // table layout to add mines to
private Block blocks[][]; // blocks for mine field
public void onCreate(Bundle savedInstanceState)
{
...
mineField = (TableLayout)findViewById(R.id.MineField);
}
private void showMineField()
{
for (int row = 1; row < numberOfRowsInMineField + 1; row++)
{
TableRow tableRow = new TableRow(this);
tableRow.setLayoutParams(new LayoutParams((blockDimension + 2 * blockPadding) *
numberOfColumnsInMineField, blockDimension + 2 * blockPadding));
for (int column = 1; column < numberOfColumnsInMineField + 1; column++)
{
blocks[row][column].setLayoutParams(new LayoutParams(
blockDimension + 2 * blockPadding,
blockDimension + 2 * blockPadding));
blocks[row][column].setPadding(blockPadding, blockPadding, blockPadding, blockPadding);
tableRow.addView(blocks[row][column]);
}
mineField.addView(tableRow,new TableLayout.LayoutParams(
(blockDimension + 2 * blockPadding) * numberOfColumnsInMineField, blockDimension + 2 * blockPadding));
}
}
复制代码
用Handler取代Timer
可以用两种方法使用Handler,一种是给Handler传递消息并在消息收到时执行特定的操作,另一种是在Handler中调度一个Runable对象。我们在扫雷中使用第二种方法,使用Handler的好处在于它和creator线程中的thread/message队列相联系。了解更多关于Handler的信息,实现handler的代码如下:
java代码:
private Handler timer = new Handler();
private int secondsPassed = 0;
public void startTimer()
{
if (secondsPassed == 0)
{
timer.removeCallbacks(updateTimeElasped);
// tell timer to run call back after 1 second
timer.postDelayed(updateTimeElasped, 1000);
}
}
public void stopTimer()
{
// disable call backs
timer.removeCallbacks(updateTimeElasped);
}
// timer call back when timer is ticked
private Runnable updateTimeElasped = new Runnable()
{
public void run()
{
long currentMilliseconds = System.currentTimeMillis();
++secondsPassed;
txtTimer.setText(Integer.toString(secondsPassed));
// add notification
timer.postAtTime(this, currentMilliseconds);
// notify to call back after 1 seconds
// basically to remain in the timer loop
timer.postDelayed(updateTimeElasped, 1000);
}
};
复制代码
系列之Android 扫雷游戏(一)的帖子链接http://www.eoeandroid.com/thread-102103-1-1.html
系列之Android 扫雷游戏(三)的帖子链接http://www.eoeandroid.com/thread-102116-1-1.html
系列之Android 扫雷游戏(四)的帖子链接http://www.eoeandroid.com/thread-102272-1-1.html
系列之Android 扫雷游戏(五)的帖子链接http://www.eoeandroid.com/thread-102273-1-1.html |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|