(六)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>

 

posted @ 2015-08-21 11:23  小菜美妞成长中  阅读(1238)  评论(0编辑  收藏  举报