Handler实现倒计时功能

论坛 期权论坛 脚本     
niminba   2021-5-23 02:58   793   0

本文实例为大家分享了Handler实现倒计时功能的具体代码,供大家参考,具体内容如下

1、需求

1.1 实现目标

当后台传递一个时间戳时,与当前系统时间做时间差,并转换为时分秒,作为商品活动的倒计时;

如下图所示:

1.2 实现步骤

自定义View

1、实现倒计时功能,封装成方法;
2、初始化倒计时功能,及布局文件;
3、通过Handler中的post()或sendMessage()方法向主线程传递消息,不对刷新UI;
4、对外暴露一个方法,接收后台传入的时间戳;

在Activity中实现
通过自定义View中的方法,接收时间戳;

2、封装成自定义view

2.1 倒计时功能

方法名 processCountMsg()

private boolean processCountMsg() {
        if (hou == 0 && min == 0 && sec == 0) {
            Toast.makeText(getContext(), "时间到", Toast.LENGTH_SHORT).show();
            return false;
        }
        if (sec > 0) {
            sec--;
        } else {
            sec = 59;
            if (min == 0) {
                min = 59;
                hou--;
            } else {
                min--;
            }
        }
        String hour, minute, second;
        hour = (hou < 10) ? "0" + hou : "" + hou;
        minute = (min < 10) ? "0" + min : "" + min;
        second = (sec < 10) ? "0" + sec : "" + sec;

        tv_hour.setText(hour);
        tv_min.setText(minute);
        tv_sec.setText(second);
        return true;
    }

2.2 初始化倒计时功能及布局文件

初始化代码 init()

private void init() {
        //TODO  LayoutInflater中inflate三个参数代表含义
     LayoutInflater.from(getContext()).inflate(R.layout.layout_countdown_time, this, true);
        tv_hour = findViewById(R.id.btn_countdown_hour);
        tv_min = findViewById(R.id.countdown_min);
        tv_sec = findViewById(R.id.countdown_sec);
        runnable = new Runnable() {
            @Override
            public void run() {
                boolean needProcess = processCountMsg();
                if(!needProcess)return;
                //没隔一秒再次执行一次run方法,实现倒计时功能
                mHandler.postDelayed(this, 1000);
            }
        };
    }

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal"
    android:layout_margin="10dp">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="距结束:"
        android:textColor="#DAA520"
        android:textSize="20dp"/>
    <TextView
        android:id="@+id/btn_countdown_hour"
        android:layout_width="31dp"
        android:layout_height="30dp"
        android:layout_marginRight="2dp"
        android:background="@drawable/countdown_shape"
        android:gravity="center"
        android:textColor="@color/white" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=":"/>
    <TextView
        android:id="@+id/countdown_min"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginRight="2dp"
        android:background="@drawable/countdown_shape"
        android:textColor="@color/white"
        android:gravity="center"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=":"/>
    <TextView
        android:id="@+id/countdown_sec"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:background="@drawable/countdown_shape"
        android:textColor="@color/white"
        android:gravity="center"/>
</LinearLayout>

2.3 提供对外方法,处理时间戳

使用post() 发送消息

public void setData(long curDate) {
        //TODO
        String time;
        //计算时间戳与系统时间的时间差,单位为秒
        int timeDifference = (int) (curDate - System.currentTimeMillis());
        //将总秒数转化为时分秒
        if (timeDifference < 60) {
            time = String.format("00:00:%02d", timeDifference % 60);
        } else if (timeDifference < 3600) {
            time = String.format("00:%02d:%02d", timeDifference / 60, timeDifference % 60);
        } else {
            time = String.format("%02d:%02d:%02d", timeDifference / 3600, timeDifference % 3600 / 60, timeDifference % 60);
        }
        //通过“:”分离时、分、秒
        String[] sArray = time.spl	U1QI耈%U94(Q54(E>[b7j^^_jb{:r^^B;7U'/RKB;B5j>^^B;&7
AW&34+zs7^^"['Sny5G>r&7jB7kr^B4(4(brZj3ro疒j惚r'&*rokkR2
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP