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/n/142224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
FDBYFDBY
上一篇 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

发表回复

登录后才能评论