一、實現原理
倒計時功能的實現原理很簡單,就是通過Handler不斷地向主線程發送Message,用Message中的arg1來存放倒計時的時間,通過TextView顯示出來。當倒計時結束時,停止向主線程發送Message。
二、實現步驟
1、首先在布局文件中添加一個TextView來顯示倒計時的時間:
<TextView
android:id="@+id/tv_countdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@android:color/black" />
2、在Activity中獲取TextView的實例,並使用Handler實現倒計時:
public class MainActivity extends AppCompatActivity {
private TextView mCountdownView;
private static final int MSG_UPDATE_COUNTDOWN = 1;
private static final int COUNTDOWN_TIME = 60;//倒計時60秒
private int mCountdown = COUNTDOWN_TIME;//用於記錄倒計時的剩餘時間
private Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_UPDATE_COUNTDOWN:
mCountdownView.setText(msg.arg1 + "秒");
if (msg.arg1 == 0) {
stopCountdown();
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCountdownView = findViewById(R.id.tv_countdown);
startCountdown();
}
//開始倒計時
private void startCountdown() {
mCountdown = COUNTDOWN_TIME;
mHandler.post(mCountdownRunnable);
}
//停止倒計時
private void stopCountdown() {
mHandler.removeCallbacksAndMessages(null);
}
private Runnable mCountdownRunnable = new Runnable() {
@Override
public void run() {
mCountdown--;
Message msg = mHandler.obtainMessage(MSG_UPDATE_COUNTDOWN);
msg.arg1 = mCountdown;
mHandler.sendMessage(msg);
if (mCountdown > 0) {
mHandler.postDelayed(this, 1000);//每隔1秒向主線程發送一次Message
}
}
};
}
三、實現效果
啟動應用後,TextView會顯示60秒,然後每秒鐘減少1秒,直到倒計時結束:
60秒
59秒
58秒
57秒
56秒
……
2秒
1秒
0秒
完整代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_countdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@android:color/black" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private TextView mCountdownView;
private static final int MSG_UPDATE_COUNTDOWN = 1;
private static final int COUNTDOWN_TIME = 60;//倒計時60秒
private int mCountdown = COUNTDOWN_TIME;//用於記錄倒計時的剩餘時間
private Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_UPDATE_COUNTDOWN:
mCountdownView.setText(msg.arg1 + "秒");
if (msg.arg1 == 0) {
stopCountdown();
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCountdownView = findViewById(R.id.tv_countdown);
startCountdown();
}
//開始倒計時
private void startCountdown() {
mCountdown = COUNTDOWN_TIME;
mHandler.post(mCountdownRunnable);
}
//停止倒計時
private void stopCountdown() {
mHandler.removeCallbacksAndMessages(null);
}
private Runnable mCountdownRunnable = new Runnable() {
@Override
public void run() {
mCountdown--;
Message msg = mHandler.obtainMessage(MSG_UPDATE_COUNTDOWN);
msg.arg1 = mCountdown;
mHandler.sendMessage(msg);
if (mCountdown > 0) {
mHandler.postDelayed(this, 1000);//每隔1秒向主線程發送一次Message
}
}
};
}
原創文章,作者:FDBY,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/142224.html