您的位置:

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
            }
        }
    };
}
Android开发:完美实现倒计时功能

2023-05-14
CountdownTimer: Android倒计时定时器

2023-05-16
Android倒计时详细解析

2023-05-21
提高生产效率的Android专业计时器

2023-05-14
Android日历开发全方位详解

2023-05-19
Android Studio底部导航栏的完美实现

在Android应用程序开发中,底部导航栏是一种常用的UI设计元素,用于在不同的页面之间进行快速导航。在Android Studio中,我们可以很方便地使用底部导航栏来实现这一功能。本文将介绍Andr

2023-12-08
Android应用开发 | 如何设计一个完美的用户界面

2023-05-14
Android开发中如何实现定时器功能

2023-05-14
十分钟倒计时

2023-05-17
Android定时器实现任务自动执行

2023-05-14
Python实现Unity游戏开发倒计时功能

2023-05-12
Flutter和Android Studio的完美结合:打造

2023-05-16
Android定时器:如何实现正确的计时机制

2023-05-14
使用Android Studio轻松实现无线调试

2023-05-14
ArcGIS for Android:地图应用开发的完美解决

2023-05-20
Android开发中的全能工具-androidt

2023-05-18
Android开源项目:轻松实现侧滑菜单功能

2023-05-14
androiddevtools——完美支持Android开发

2023-05-21
利用渐变效果增强Android应用设计美观度

Android应用的UI设计无论是在颜色搭配还是在样式设计上都需要做到眼里有角度、美学有追求,这就要求我们在设计中要充分发挥自己的想象力。而在设计中,渐变效果是一种非常常见和实用的设计方式。渐变效果可

2023-12-08
Android任务:实现简单的计算器功能

2023-05-14