Android 验证码倒计时两种方案
使用
第一种方案:自定义控件
1.在布局中使用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"> <com.ywj.countdowntextviewdemo.CountDownTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/countDownTextView"
android:text="Hello World!" />
</RelativeLayout>
2.在Activity中获取控件使用
CountDownTextView countDownTextView = (CountDownTextView) findViewById(R.id.countDownTextView);
countDownTextView.setCountDownMillis();
countDownTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("MainActivity","点击事件");
}
});
countDownTextView.start();
3.CountDownTextView.java
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.ColorRes;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView; /**
* 倒计时TextView
* Created by weijing on 2017-08-21 14:43.
*/ public class CountDownTextView extends TextView { /**
* 提示文字
*/
private String mHintText = "重新发送"; /**
* 倒计时时间
*/
private long mCountDownMillis = 60_000; /**
* 剩余倒计时时间
*/
private long mLastMillis;
/**
* 间隔时间差(两次发送handler)
*/
private long mIntervalMillis = 1_000;
/**
* 开始倒计时code
*/
private final int MSG_WHAT_START = 10_010;
/**
* 可用状态下字体颜色Id
*/
private int usableColorId = android.R.color.holo_blue_light;
/**
* 不可用状态下字体颜色Id
*/
private int unusableColorId = android.R.color.darker_gray; public CountDownTextView(Context context) {
super(context);
} public CountDownTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
} public CountDownTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg); switch (msg.what) {
case MSG_WHAT_START:
// Log.e("l", mLastMillis + "");
if (mLastMillis > ) {
setUsable(false);
mLastMillis -= mIntervalMillis;
mHandler.sendEmptyMessageDelayed(MSG_WHAT_START, mIntervalMillis);
} else {
setUsable(true);
}
break;
}
}
}; /**
* 设置是否可用
*
* @param usable
*/
public void setUsable(boolean usable) { if (usable) {
//可用
if (!isClickable()) {
setClickable(usable);
setTextColor(getResources().getColor(usableColorId));
setText(mHintText);
}
} else {
//不可用
if (isClickable()) {
setClickable(usable);
setTextColor(getResources().getColor(unusableColorId));
}
setText(mLastMillis / + "秒后" + mHintText);
} } /**
* 设置倒计时颜色
*
* @param usableColorId 可用状态下的颜色
* @param unusableColorId 不可用状态下的颜色
*/
public void setCountDownColor(@ColorRes int usableColorId, @ColorRes int unusableColorId) {
this.usableColorId = usableColorId;
this.unusableColorId = unusableColorId;
} /**
* 设置倒计时时间
*
* @param millis 毫秒值
*/
public void setCountDownMillis(long millis) {
mCountDownMillis = millis;
} /**
* 开始倒计时
*/
public void start() {
mLastMillis = mCountDownMillis;
mHandler.sendEmptyMessage(MSG_WHAT_START);
} /**
* 重置倒计时
*/
public void reset() {
mLastMillis = ;
mHandler.sendEmptyMessage(MSG_WHAT_START);
} @Override
public void setOnClickListener(@Nullable final OnClickListener onClickListener) {
super.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mHandler.removeMessages(MSG_WHAT_START);
start();
onClickListener.onClick(v);
}
}); } @Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mHandler.removeMessages(MSG_WHAT_START);
}
}
第二种方案:工具类
1.在activity中使用
TextView textView = (TextView) findViewById(R.id.textView);
new CountDownUtil(textView)
.setCountDownMillis(60_000L)//倒计时60000ms
.setCountDownColor(android.R.color.holo_blue_light,android.R.color.darker_gray)//不同状态字体颜色
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("MainActivity","发送成功");
}
})
.start();
2.CountDownUtil.java
import android.os.Handler;
import android.os.Message;
import android.support.annotation.ColorRes;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView; import java.lang.ref.WeakReference; /**
* 倒计时工具
* Created by weijing on 2017-08-22 11:50.
*/ public class CountDownUtil {
/**
* 开始倒计时code
*/
private final int MSG_WHAT_START = 10_010;
/**
* 弱引用
*/
private WeakReference<TextView> mWeakReference;
/**
* 倒计时时间
*/
private long mCountDownMillis = 60_000;
/**
* 提示文字
*/
private String mHintText = "重新发送"; /**
* 剩余倒计时时间
*/
private long mLastMillis; /**
* 间隔时间差(两次发送handler)
*/
private long mIntervalMillis = 1_000; /**
* 可用状态下字体颜色Id
*/
private int usableColorId = android.R.color.holo_blue_light;
/**
* 不可用状态下字体颜色Id
*/
private int unusableColorId = android.R.color.darker_gray; private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg); switch (msg.what) {
case MSG_WHAT_START:
if (mLastMillis > ) {
setUsable(false);
mLastMillis -= mIntervalMillis;
if (mWeakReference.get() != null) {
mHandler.sendEmptyMessageDelayed(MSG_WHAT_START, mIntervalMillis);
}
} else {
setUsable(true);
}
break;
}
}
}; public CountDownUtil(TextView textView) {
mWeakReference = new WeakReference<>(textView);
} public CountDownUtil(TextView textView, long countDownMillis) {
mWeakReference = new WeakReference<>(textView);
this.mCountDownMillis = countDownMillis;
} public CountDownUtil setCountDownMillis(long countDownMillis) {
this.mCountDownMillis = countDownMillis;
return this;
} /**
* 设置是否可用
*
* @param usable
*/
private void setUsable(boolean usable) {
TextView mTextView = mWeakReference.get();
if (mTextView != null) {
if (usable) {
//可用
if (!mTextView.isClickable()) {
mTextView.setClickable(usable);
mTextView.setTextColor(mTextView.getResources().getColor(usableColorId));
mTextView.setText(mHintText);
}
} else {
//不可用
if (mTextView.isClickable()) {
mTextView.setClickable(usable);
mTextView.setTextColor(mTextView.getResources().getColor(unusableColorId));
}
String content = mLastMillis / + "秒后" + mHintText;
mTextView.setText(content); }
}
} /**
* 设置倒计时颜色
*
* @param usableColorId 可用状态下的颜色
* @param unusableColorId 不可用状态下的颜色
*/
public CountDownUtil setCountDownColor(@ColorRes int usableColorId, @ColorRes int unusableColorId) {
this.usableColorId = usableColorId;
this.unusableColorId = unusableColorId;
return this;
} /**
* 开始倒计时
*/
public CountDownUtil start() {
mLastMillis = mCountDownMillis;
mHandler.sendEmptyMessage(MSG_WHAT_START);
return this;
} public CountDownUtil setOnClickListener(@Nullable final View.OnClickListener onClickListener) {
TextView mTextView = mWeakReference.get();
if (mTextView != null)
mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mHandler.removeMessages(MSG_WHAT_START);
start();
onClickListener.onClick(v);
}
});
return this;
} /**
* 重置停止倒计时
*/
public CountDownUtil reset() {
mLastMillis = ;
mHandler.sendEmptyMessage(MSG_WHAT_START);
return this;
}
TextView textView = (TextView) findViewById(R.id.textView);
new CountDownUtil(textView)
.setCountDownMillis(60_000L)//倒计时60000ms
.setCountDownColor(android.R.color.holo_blue_light,android.R.color.darker_gray)//不同状态字体颜色
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("MainActivity","发送成功");
}
})
.start();
Android 验证码倒计时两种方案的更多相关文章
- android环境下两种md5加密方式
在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...
- 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
http://www.jb51.net/article/70415.htm 含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...
- android studio gradle 两种更新方法更新
android studio gradle 两种更新方法更新 第一种.Android studio更新 第一步:在你所在项目文件夹下:你项目根目录gradlewrappergradle-wrapper ...
- Xamarin Android Fragment的两种加载方式
android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...
- Linux下实现秒级定时任务的两种方案
Linux下实现秒级定时任务的两种方案(Crontab 每秒运行): 第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command s ...
- 【转】在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)
在Android Studio中下载Android SDK的两种方式(Android Studio3.0.windows) 方式一.设置HTTP Proxy1. 打开Settings2. 点击HTTP ...
- [转载]Java操作Excel文件的两种方案
微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel.时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发.在我们实际开发企业办公系统的过程中,常常有客户这样子要 ...
- .Net Core下使用RabbitMQ比较完备的两种方案(虽然代码有点惨淡,不过我会完善)
一.前言 上篇说给大家来写C#和Java的方案,最近工作也比较忙,迟到了一些,我先给大家补上C#的方案,另外如果没看我上篇博客的人最好看一下,否则你可能看的云里雾里的,这里我就不进行具体的方案 ...
- 比较好用的移动端适配的两种方案及flexible和px2rem-loader在webpack下的配置
移动端适配,目前自己常用的两种 方案,参考以下两篇好文 方案一:使用lib-flexible包 https://www.w3cplus.com/mobile/lib-flexible-for-html ...
随机推荐
- vue.js created函数注意事项
因为created钩子函数是页面一加载完就会调用的函数,所以如果你想在这个组件拿值或者是赋值,很可能this里面能拿到数据,但是如果你用this.赋值的话,控制台或者debugger都会发现this里 ...
- 简单三步快速学会使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件(postgre使用实例)
前言: mybatis-generator是根据配置文件中我们配置的数据库连接参数自动连接到数据库并根据对应的数据库表自动的生成与之对应mapper映射(比如增删改查,选择性增删改查等等简单语句)文件 ...
- Sense2vec with spaCy and Gensim
如果你在2015年做过文本分析项目,那么你大概率用的是word2vec模型.Sense2vec是基于word2vec的一个新模型,你可以利用它来获取更详细的.与上下文相关的词向量.本文主要介绍该模型的 ...
- 3.javascript转换日期字符串为Date对象
js中文网 阮一峰 1.求format“xxxx年xx月xx日 xx:xx”类型的两个日期天数差 var start = "2017年09月17日 13:51"; var end ...
- JDK1.8中对hashmap的优化
在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个“链表散列”的数据结 ...
- 【网络爬虫】【java】微博爬虫(三):庖丁解牛——HTML结构分析与正则切分
在上一篇文章中已经通过请求的url地址把html页面爬取下来了,这里分别以网易微博的html和新浪微博的html为例来分析如何提取微博数据. 一.网易微博解析 相比新浪微博的html结构,网易微博的比 ...
- 3 手写Java HashMap核心源码
手写Java HashMap核心源码 上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码. 我们来先了解一下HashMap的原理.HashMap 字面意思 has ...
- HDU1597【二分瞎搞】
题意: 求第n个数: 思路: 可以看到一种序列: 1 12 123 1234 12345 123456 1234567 12345678 123456789 1234567891 1234567891 ...
- chmod 详解
http://man.linuxde.net/chmod chmod u+x,g+w f01 //为文件f01设置自己可以执行,组员可以写入的权限 chmod u=rwx,g=rw,o=r f01 c ...
- Hexo搭建博客教程(1) - 安装环境与本地搭建
前言 搭建个人博客一般有两种选择,一个是使用WordPress,但是需要将博客搭建在服务器上,不过搭建好后写文章方便,适合没有程序基础的人使用.另一个是使用Hexo,相对简洁高效,不需要服务器,既可以 ...