(六)Android中使用CountDownTimer实现倒计时功能

一、倒计时运行效果图

开发中经常遇到获取短信验证码后需要等待1分钟倒计时,这时需要一个倒计时程序。本文利用CountDownTimer封装了一个比较好用的倒计时工具类,方便以后程序开发。下面是倒计时功能的运行效果图:

二、此工程结构如下所示:

三、此工程中各个重点文件的代码如下所示:

3.1 TimeCount.java是实现倒计时的工具类,此工具类可以在很多倒计时场合使用,此类中的代码如下所示:

package com.example.timecountdemo;

import android.os.CountDownTimer;
import android.widget.Button;

/**
 * 类说明:实现倒计时
 * @author  fuyn
 * @date    2015-7-20
 * @version 1.0.0
 */
public class TimeCount extends CountDownTimer {

    private Button btn;
    private String unClickedText;  //不可点击时的文字
    private String enableClickText;  //可点击时的文字
    private int unClickedTextColor;     //不可点击时候的文字颜色
    private int enableClickTextColor;        //可点击时候的文字颜色
    private boolean refreshTextModelFlag = true;  //设置文字显示的样式
    private boolean isOnTick = false ;     //是否正在倒计时

    /**
     * 构造函数
     * @param millisInFuture:倒计时总时间(如60s,120s等),单位为ms
     * @param countDownInterval:渐变时间(每次到计时1s),单位为ms
     * @param btn:点击的按钮
     * @param unClickedText:不可点击时的文字
     * @param enableClickText:可点击时的文字
     * @param unClickedTextColor:不可点击时候的文字颜色
     * @param enableClickTextColor:可点击时候的文字颜色
     */
    public TimeCount(long millisInFuture, long countDownInterval, Button btn,
            String unClickedText, String enableClickText, int unClickedTextColor,
            int enableClickTextColor) {
        super(millisInFuture, countDownInterval);
        this.btn = btn;
        this.unClickedText = unClickedText;
        this.enableClickText = enableClickText;
        this.unClickedTextColor = unClickedTextColor;
        this.enableClickTextColor = enableClickTextColor;
    }

    public TimeCount(long millisInFuture, long countDownInterval, Button btn,
            String unClickedText, String enableClickText) {
        super(millisInFuture, countDownInterval);
        this.btn = btn;
        this.unClickedText = unClickedText;
        this.enableClickText = enableClickText;
    }

    public TimeCount(long millisInFuture, long countDownInterval, Button btn,
            int unClickedTextColor, int enableClickTextColor) {
        super(millisInFuture, countDownInterval);
        this.btn = btn;
        this.unClickedTextColor = unClickedTextColor;
        this.enableClickTextColor = enableClickTextColor;
    }

    /**
     * 构造函数
     * @param millisInFuture:倒计时总时间(如60s,120s等),单位为ms
     * @param countDownInterval:渐变时间(每次到计时1s),单位为ms
     */
    public TimeCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }

    /**
     * 计时过程显示
     */
    @Override
    public void onTick(long millisUntilFinished) {

        setOnTick(true);
        if(btn != null){
            btn.setEnabled(false);
            if(!refreshTextModelFlag){
                btn.setText("("+millisUntilFinished/1000+")" + unClickedText);
            }else{
                btn.setText(unClickedText+"("+millisUntilFinished/1000+")");
            }
            btn.setTextColor(unClickedTextColor);
        }
    }

    /**
     * 计时完毕时触发
     */
    @Override
    public void onFinish() {
        setOnTick(false);
        if(btn != null){
            btn.setEnabled(true);
            btn.setText(enableClickText);
            btn.setTextColor(enableClickTextColor);
        }
    }

    public Button getBtn() {
        return btn;
    }

    public void setBtn(Button btn) {
        this.btn = btn;
    }

    public String getUnClickedText() {
        return unClickedText;
    }

    public void setUnClickedText(String unClickedText) {
        this.unClickedText = unClickedText;
    }

    public String getEnableClickText() {
        return enableClickText;
    }

    public void setEnableClickText(String enableClickText) {
        this.enableClickText = enableClickText;
    }

    public int getUnClickedTextColor() {
        return unClickedTextColor;
    }

    public void setUnClickedTextColor(int unClickedTextColor) {
        this.unClickedTextColor = unClickedTextColor;
    }

    public int getEnableClickTextColor() {
        return enableClickTextColor;
    }

    public void setEnableClickTextColor(int enableClickTextColor) {
        this.enableClickTextColor = enableClickTextColor;
    }

    public boolean isRefreshTextModelFlag() {
        return refreshTextModelFlag;
    }

    public void setRefreshTextModelFlag(boolean refreshTextModelFlag) {
        this.refreshTextModelFlag = refreshTextModelFlag;
    }

    public boolean isOnTick() {
        return isOnTick;
    }

    public void setOnTick(boolean isOnTick) {
        this.isOnTick = isOnTick;
    }

}

3.2 MainActivity.java中代码如下所示:

package com.example.timecountdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
    private TimeCount mTimeCount;
    private Button login_btn_get_verification_code;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        login_btn_get_verification_code = (Button) this
                .findViewById(R.id.login_btn_get_code);
        login_btn_get_verification_code.setOnClickListener(olc);
        mTimeCount = new TimeCount(60000, 1000,
                login_btn_get_verification_code, getResources().getColor(
                        R.color.login_btn_unclicked_text_color), getResources()
                        .getColor(R.color.login_btn_enable_clicked_text_color));
        mTimeCount.setRefreshTextModelFlag(true);
        mTimeCount.setEnableClickText("重新获取");
        mTimeCount.setUnClickedText("点击获取");
    }

    OnClickListener olc = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {
            case R.id.login_btn_get_code:
                mTimeCount.start();
                break;
            }
        }
    };

}

3.3 activity_main.xml中代码如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/login_rl_code"
    android:layout_width="fill_parent"
    android:layout_height="48dp"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="15dp"
    android:layout_marginRight="15dp" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/login_tv_verification_code"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_marginLeft="15dp"
            android:gravity="center_vertical"
            android:text="验证码"
            android:textColor="#333333"
            android:textSize="15sp" />

        <EditText
            android:id="@+id/login_et_sms_code"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="15dp"
            android:layout_weight="1"
            android:background="@null"
            android:hint="请输入验证码"
            android:inputType="number"
            android:textColor="#333333"
            android:textColorHint="#bbbbbb"
            android:textSize="15sp" />

        <Button
            android:id="@+id/login_btn_get_code"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:text="点击获取"
            android:textColor="#33b5e5"
            android:textSize="10sp" />
    </LinearLayout>

    <View
        android:id="@+id/login_view_line2"
        android:layout_width="fill_parent"
        android:layout_height="1px"
        android:layout_alignParentBottom="true"
        android:background="#d4d4d4" />

</RelativeLayout>

3.4 colors.xml的代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="login_btn_unclicked_text_color">#cccccc</color>
    <color name="login_btn_enable_clicked_text_color">#33b5e5</color>
</resources>
时间: 08-19

(六)Android中使用CountDownTimer实现倒计时功能的相关文章

Android之旅十六 android中各种资源的使用

android中各种资源的使用: 在android开发中,各种资源的合理使用应该在各自的xml中进行定义,以便重复使用; 字符串资源:strings.xml,xml中引用:@string/XXX,java代码中引用:R.string.XXX 样式资源:styles.xml,xml中引用:@style/XXX,java代码中引用:R.style.XXX 图片资源:colors.xml,xml中引用:@color/XXX,java代码中引用:R.color.XXX 尺寸资源:dimens.xml,x

android中实现简单的聊天功能

这个例子只是简单的实现了单机版的聊天功能,自己跟自己聊,啦啦~~ 主要还是展示RecyclerView控件的使用吧~ 参考我之前写的文章: android中RecyclerView控件的使用 android中使用Nine-Patch图片 1.先添加一个关于聊天内容的Chat.java类: package com.example.chenrui.common; public class Chat { private String targetUser; private String content

Android笔记(六十六) android中的动画——XML文件定义属性动画

除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中.然后在XML文件中我们一共可以使用如下三种标签: <animator>  对应代码中的ValueAnimator <objectAnimator>  对应代码中的ObjectAnimator <set>  对应代码中的AnimatorSet 使用XML设置动

android中RecyclerView控件实现长按弹出PopupMenu菜单功能

之前写过一篇文章:android中实现简单的聊天功能 现在是在之前功能的基础上,添加一个长按聊天记录,删除对应聊天记录的功能 RecyclerView控件,没有对应的长按事件,我们需要自己手工添加,修改对应的适配器类,注意红色内容为添加内容 ChatAdapter.java: package com.example.chenrui.app1; import android.support.annotation.NonNull; import android.support.v7.widget.R

Android中插件开发篇总结和概述

刚刚终于写完了插件开发的最后一篇文章,下面就来总结一下,关于Android中插件篇从去年的11月份就开始规划了,主要从三个方面去解读Android中插件开发原理.说白了,插件开发的原理就是:动态加载技术.但是我们在开发插件的过程中可能会遇到很多问题,所以这里就分为三篇文章进行解读的,而且也是循序渐进,解决了插件开发过程中可能会遇到的问题,不过这三篇的基础还是动态加载技术. 第一.插件开发基础篇:动态加载技术解读 http://blog.csdn.net/jiangwei0910410003/ar

Android倒计时功能的实现(CountDownTimer)

以前编程的时候,遇到倒计时的功能时,经常自己去写,但其实Android已经帮封装好了一个倒计时类CountDownTimer,其实是将后台线程的创建和Handler队列封装成为了一个方便的类调用. 说明: CountDownTimer timer = new CountDownTimer(30000, 1000)中,第一个参数表示总时间,第二个参数表示间隔时间. 意思就是每隔一秒会回调一次方法onTick,然后30秒之后会回调onFinish方法. package com.androidcoun

Android基础之——CountDownTimer类,轻松实现倒计时功能

在发现这个类之前,一直是用的handler,子线程发消息,UI线程进行倒计时的显示工作.前几天在做一个倒计时显示的时候发现了这个类,用起来很方便 翻看了下源码,内部已经帮我们实现了handler的子线程操作 CountDownTimer这个类用起来很简单,两个参数,几句代码搞定,如下: CountDownTimer(long millisInFuture, long countDownInterval) 构造函数有两个参数,第一个millisInFuture是指要倒计时的总时间,单位是long

android中倒计时控件CountDownTimer分析

android中倒计时控件CountDownTimer分析 1 示例代码 new CountDownTimer(10000, 1000) { public void onTick(long millisUntilFinished) { LogUtil.i(TAG, "seconds remaining: " + millisUntilFinished / 1000); } public void onFinish() { LogUtil.i(TAG, "done!"

浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始