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