在移动应用程序中,倒计时计时器是一项有趣的功能,它允许用户跟踪一个事件的剩余时间。例如,倒计时计时器可以用来追踪用户的生日、节假日、特别活动或倒计时计时器。在本文中,我们将介绍如何使用Android Studio制作一个简单的倒计时计时器应用程序并实现相关功能。
1. 设计UI界面
首先,我们将创建一个基本的用户界面,其中包括一个文本框、一个Buttons和两个TextViews来显示倒计时计时器。
这里我们需要两个TextView来显示剩余的时间和说明信息。Button用于启动和停止计时器。Text Input用于用户输入活动时间。
2. 处理倒计时
在计时器应用程序中处理剩余时间的最好方法是使用CountDownTimer类。该类允许我们指定倒计时的总计时间,以及每一秒钟间隔触发事件。
在这个应用程序中,我们实现了一个名为MyCountDownTimer的内部类。该类继承了Android的CountDownTimer类,我们在这个类中可以实现自己的逻辑,CountDownTimer类是从android.os. CountDownTimer类继承过来的。
MyCountDownTimer负责处理剩余时间并更新UI控件,如下所示:
private class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished; // 更新时间
updateCountdownText();
}
@Override
public void onFinish() {
mTimerRunning = false;
toggleButton(); // 恢复开始状态
}
}
在onTick方法中更新TextView的剩余时间。并在onFinish中停止定时器并恢复按钮的开始状态。
3. 实现启动和停止计时器
接下来,我们将为启动和停止倒计时计时器添加代码逻辑。当用户按下开始按钮时,我们将检查计时器是否已启动并启动它。如果定时器已经启动,则我们不需要做任何事情。否则,我们将启动计时器并更新界面。
当用户按下停止按钮时,我们将停止计时器并恢复开始按钮的状态。
4. 获取用户选择的时间
在启动定时器之前,我们需要获取用户选择的时间。我们使用Text Input来获取这个时间。获取输入的文本后,我们将它转换为int类型的毫秒值,并验证它是否大于零。如果输入无效,则我们将显示错误消息。
5. 完整代码
下面是实现的完整代码。它包括UI设计文件(XML)和MainActivity.java文件,用于处理逻辑。
activity_main.xml:
```
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> android:id="@+id/text_view_countdown" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00:00:00" android:textSize="50sp" android:layout_centerHorizontal="true" android:layout_marginTop="50dp"/> android:id="@+id/edit_text_input_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/text_view_countdown" android:layout_centerHorizontal="true" android:layout_marginTop="50dp" android:hint="Enter time in seconds"/>
```
MainActivity.java:
```java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView mTextViewCountDown;
private EditText mEditTextInput;
private Button mButtonStartPause;
private Button mButtonReset;
private TextView mTextViewInfo;
private MyCountDownTimer mCountDownTimer;
private boolean mTimerRunning;
private long mTimeLeftInMillis;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextViewCountDown = findViewById(R.id.text_view_countdown);
mEditTextInput = findViewById(R.id.edit_text_input_time);
mButtonStartPause = findViewById(R.id.button_start);
mButtonReset = findViewById(R.id.button_stop);
mTextViewInfo = findViewById(R.id.text_view_info);
mButtonStartPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTimerRunning) {
pauseTimer();
} else {
startTimer();
}
}
});
mButtonReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resetTimer();
}
});
}
private void startTimer() {
String input = mEditTextInput.getText().toString();
if (input.length() == 0) {
mTextViewInfo.setText("Please enter a time");
return;
}
long millisInput = Long.parseLong(input) * 1000;
if (millisInput == 0) {
mTextViewInfo.setText("Please enter a positive number");
return;
}
setTime(millisInput);
mButtonReset.setVisibility(View.VISIBLE);
mButtonStartPause.setText("Pause");
mTimerRunning = true;
mCountDownTimer = new MyCountDownTimer(millisInput, 1000);
mCountDownTimer.start();
mTextViewInfo.setText("Countdown started");
}
private void pauseTimer() {
mCountDownTimer.cancel();
mTimerRunning = false;
mButtonStartPause.setText("Start");
mTextViewInfo.setText("Countdown paused");
}
private void resetTimer() {
mTimeLeftInMillis = 0;
updateCountdownText();
mButtonReset.setVisibility(View.INVISIBLE);
mButtonStartPause.setText("Start");
mTextViewInfo.setText("Countdown stopped");
}
private void setTime(long milliseconds) {
mTimeLeftInMillis = milliseconds;
updateCountdownText();
}
private void updateCountdownText() {
int hours = (int) (mTimeLeftInMillis / 1000) / 3600;
int minutes = (int) ((mTimeLeftInMillis / 1000) % 3600) / 60;
int seconds = (int) (mTimeLeftInMillis / 1000) % 60;
String timeLeftFormatted = String.format("%02d:%02d:%02d", hours, minutes, seconds);
mTextViewCountDown.setText(timeLeftFormatted);
}
private class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
updateCountdownText();
}
@Override
public void onFinish() {
mTimerRunning = false;
mButtonStartPause.setText("Start");
mButtonReset.setVisibility(View.INVISIBLE);
mTextViewInfo.setText("Countdown finished");
}
}
}
```
6. 结论
在此教程中,我们实现了一个简单易用的倒计时计时器应用程序。通过按照这些步骤,您可以制作和调整自己的倒计时计时器应用程序,并为它添加更多功能和自定义UI。