Android開發:完美實現倒計時功能

一、實現原理

倒計時功能的實現原理很簡單,就是通過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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FDBY的頭像FDBY
上一篇 2024-10-10 09:25
下一篇 2024-10-10 09:25

相關推薦

  • KeyDB Java:完美的分佈式高速緩存方案

    本文將從以下幾個方面對KeyDB Java進行詳細闡述:KeyDB Java的特點、安裝和配置、使用示例、性能測試。 一、KeyDB Java的特點 KeyDB Java是KeyD…

    編程 2025-04-29
  • Java和Python哪個功能更好

    對於Java和Python這兩種編程語言,究竟哪一種更好?這個問題並沒有一個簡單的答案。下面我將從多個方面來對Java和Python進行比較,幫助讀者了解它們的優勢和劣勢,以便選擇…

    編程 2025-04-29
  • Python每次運行變量加一:實現計數器功能

    Python編程語言中,每次執行程序都需要定義變量,而在實際開發中常常需要對變量進行計數或者累加操作,這時就需要了解如何在Python中實現計數器功能。本文將從以下幾個方面詳細講解…

    編程 2025-04-28
  • Python strip()函數的功能和用法用法介紹

    Python的strip()函數用於刪除字符串開頭和結尾的空格,包括\n、\t等字符。本篇文章將從用法、功能以及與其他函數的比較等多個方面對strip()函數進行詳細講解。 一、基…

    編程 2025-04-28
  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控件。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • 全能的wpitl實現各種功能的代碼示例

    wpitl是一款強大、靈活、易於使用的編程工具,可以實現各種功能。下面將從多個方面對wpitl進行詳細的闡述,每個方面都會列舉2~3個代碼示例。 一、文件操作 1、讀取文件 fil…

    編程 2025-04-27
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27
  • 周杰倫的花海:音樂與自然的完美融合

    周杰倫的花海,是指由周杰倫私人投資興建、位於上海市奉賢區四團鎮李家漕村的一個純生態主題公園。該公園以親近自然、體驗自然為主,植被種類豐富、景色宜人,是市區人們放鬆身心、回歸自然的好…

    編程 2025-04-27
  • Android和Vue3混合開發方案

    本文將介紹如何將Android和Vue3結合起來進行混合開發,以及其中的優勢和注意事項。 一、環境搭建 在進行混合開發之前,需要搭建好相應的開發環境。首先需要安裝 Android …

    編程 2025-04-27

發表回復

登錄後才能評論