• (六)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>
  • 相关阅读:
    Cactus详细讲解
    jexus处理静态文件(处理后缀)
    简单的html兼容(参考js和css的常规写法)
    IOHelper(自制常用的输入输出的帮助类)
    @Html.AntiForgeryToken() 源码分析,表单防伪码的生成
    缓存处理类(MemoryCache结合文件缓存)
    MVC过滤大法(过滤静态文件)
    C#文件监控工具(对追加内容的监控并输出)
    C#在Linux上的开发指南
    对java面试文章的技术漫谈的C#技术理解
  • 原文地址:https://www.cnblogs.com/fuyanan/p/4747332.html
Copyright © 2020-2023  润新知