如果方法为真,有什么方法可以暂停计时器。我创建了一个简单的拼图游戏并添加了一个计时器来显示时间流逝,我试图在解决难题时停止计时器。运行时,应用程序运行平稳,计时器在滴答作响,但在游戏结束时不会停止解决了。任何形式的帮助将不胜感激。这是代码;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
chronometer = findViewById(R.id.chronometer);
stopChronometer();
startChronometer();
isSolved();
}
public static boolean isSolved() {
boolean solved = false;
for (int i = 0; i < tileList.length; i++) {
if (tileList[i].equals(String.valueOf(i))) {
solved = true;
} else {
solved = false;
break;
}
}
return solved;
}
//to start the chronometer
public void startChronometer(){
if(!running){
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
running = true;
}
}
//to stop the chronometer
public void stopChronometer(){
if(running && isSolved()){
chronometer.stop();
running =false;
}
}
如果对整个代码感兴趣;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Button;
import java.lang.*;
import java.util.ArrayList;
import java.util.Random;
import android.widget.Chronometer;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//GestureDetectView* is the class where the puzzle grid is setup
private static GestureDetectGridView mGridView;
private static final int COLUMNS =3;
private static final int DIMENSIONS = COLUMNS * COLUMNS;
private static int mColumnWidth, mColumnHeight;
//up, down, left, right are tile movements
public static final String up = "up";
public static final String down = "down";
public static final String left = "left";
public static final String right = "right";
private static String[] tileList;
private Chronometer chronometer;
private boolean running;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chronometer = findViewById(R.id.chronometer);
init();
scramble();
setDimensions();
stopChronometer();
startChronometer();
}
//to start the chronometer
public void startChronometer(){
if(!running){
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
running = true;
}
}
//to stop the chronometer * PROBLEM AREA
public void stopChronometer(){
if(running && isSolved()){
chronometer.stop();
running =false;
}
}
//Grid view from GestureDetectView class
private void init() {
mGridView = (GestureDetectGridView) findViewById(R.id.grid);
mGridView.setNumColumns(COLUMNS);
tileList = new String[DIMENSIONS];
for (int i = 0; i < DIMENSIONS; i++) {
tileList[i] = String.valueOf(i);
}
}
//To shuffle the grid pieces
private void scramble() {
int index;
String temp;
Random random = new Random();
for (int i = tileList.length -1; i > 0; i--) {
index = random.nextInt(i + 1);
temp = tileList[index];
tileList[index] = tileList[i];
tileList[i] = temp;
}
}
private void setDimensions() {
ViewTreeObserver vto = mGridView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int displayWidth = mGridView.getMeasuredWidth();
int displayHeight = mGridView.getMeasuredHeight();
int statusbarHeight = getStatusBarHeight(getApplicationContext());
int requiredHeight = displayHeight - statusbarHeight;
mColumnWidth = displayWidth / COLUMNS;
mColumnHeight = requiredHeight / COLUMNS;
display(getApplicationContext());
}
});
}
private int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
"android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
//To determine if puzzle is solved
public static boolean isSolved() {
boolean solved = false;
for (int i = 0; i < tileList.length; i++)
{
if (tileList[i].equals(String.valueOf(i))) {
solved = true;
} else {
solved = false;
break;
}
}
return solved;
}
private static void swap(Context context, int Position, int swap) {
String newPosition = tileList[Position + swap];
tileList[Position + swap] = tileList[Position];
tileList[Position] = newPosition;
display(context);
if (isSolved()) {
Toast.makeText(context, "CONGRATULATIONS, YOU WIN!", Toast.LENGTH_SHORT).show();
}
}
//To source the image pieces and add them to the puzzle grid
private static void display(Context context) {
ArrayList<Button> buttons = new ArrayList<>();
Button button;
for (int i = 0; i < tileList.length; i++) {
button = new Button(context);
if (tileList[i].equals("0"))
button.setBackgroundResource(R.drawable.piece1);
else if (tileList[i].equals("1"))
button.setBackgroundResource(R.drawable.piece2);
else if (tileList[i].equals("2"))
button.setBackgroundResource(R.drawable.piece3);
else if (tileList[i].equals("3"))
button.setBackgroundResource(R.drawable.piece4);
else if (tileList[i].equals("4"))
button.setBackgroundResource(R.drawable.piece5);
else if (tileList[i].equals("5"))
button.setBackgroundResource(R.drawable.piece6);
else if (tileList[i].equals("6"))
button.setBackgroundResource(R.drawable.piece7);
else if (tileList[i].equals("7"))
button.setBackgroundResource(R.drawable.piece8);
else if (tileList[i].equals("8"))
button.setBackgroundResource(R.drawable.piece9);
buttons.add(button);
}
mGridView.setAdapter(new CustomAdapter(buttons, mColumnWidth, mColumnHeight));
}
public static void moveTiles(Context context, String direction, int position) {
// Upper-left-corner tile
if (position == 0) {
if (direction.equals(right)) swap(context, position, 1);
else if (direction.equals(down)) swap(context, position, COLUMNS);
else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
// Upper-center tiles
} else if (position > 0 && position < COLUMNS - 1) {
if (direction.equals(left)) swap(context, position, -1);
else if (direction.equals(down)) swap(context, position, COLUMNS);
else if (direction.equals(right)) swap(context, position, 1);
else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
// Upper-right-corner tile
} else if (position == COLUMNS - 1) {
if (direction.equals(left)) swap(context, position, -1);
else if (direction.equals(down)) swap(context, position, COLUMNS);
else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
// Left-side tiles
} else if (position > COLUMNS - 1 && position < DIMENSIONS - COLUMNS &&
position % COLUMNS == 0) {
if (direction.equals(up)) swap(context, position, -COLUMNS);
else if (direction.equals(right)) swap(context, position, 1);
else if (direction.equals(down)) swap(context, position, COLUMNS);
else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
// Right-side AND bottom-right-corner tiles
} else if (position == COLUMNS * 2 - 1 || position == COLUMNS * 3 -1)
{
if (direction.equals(up)) swap(context, position, -COLUMNS);
else if (direction.equals(left)) swap(context, position, -1);
else if (direction.equals(down)) {
// Tolerates only the right-side tiles to swap downwards as opposed to the bottom-
// right-corner tile.
if (position <= DIMENSIONS - COLUMNS - 1) swap(context, position,
COLUMNS);
else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
} else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
// Bottom-left corner tile
} else if (position == DIMENSIONS - COLUMNS) {
if (direction.equals(up)) swap(context, position, -COLUMNS);
else if (direction.equals(right)) swap(context, position, 1);
else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
// Bottom-center tiles
} else if (position < DIMENSIONS - 1 && position > DIMENSIONS - COLUMNS) {
if (direction.equals(up)) swap(context, position, -COLUMNS);
else if (direction.equals(left)) swap(context, position, -1);
else if (direction.equals(right)) swap(context, position, 1);
else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
// Center tiles
} else {
if (direction.equals(up)) swap(context, position, -COLUMNS);
else if (direction.equals(left)) swap(context, position, -1);
else if (direction.equals(right)) swap(context, position, 1);
else swap(context, position, COLUMNS);
}
}
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
}
}