Android自定义控件实现验证码倒计时

所属分类: 软件编程 / Android 阅读数: 70
收藏 0 赞 0 分享

今天给大家带来一个新的控件——验证码倒计时,先看下效果图

1 效果演示

2 使用方式

<com.landptf.view.CountDownM
 android:id="@+id/cdm_identifying_code"
 android:layout_width="wrap_content"
 android:layout_height="50dp"
 android:layout_alignParentRight="true"
 android:text="获取验证码"
 landptf:backColor="@color/colorPrimary"
 landptf:countDownSeconds="10"/>

CountDownM cdmIdentifyingCode = (CountDownM) findViewById(R.id.cdm_identifying_code);
if (cdmIdentifyingCode != null) {
 cdmIdentifyingCode.setOnClickListener(new CountDownM.OnClickListener() {
  @Override
  public void onClick(View v) {
   Toast.makeText(CountDownMTestActivity.this, "验证码发送成功", Toast.LENGTH_SHORT).show();
  }
 });
}

以上几行代码即可实现倒计时的功能,这里面我们可以设置背景色以及倒计时的总时长。

3 实现方法

/**
 * Created by landptf on 2017/03/15.
 * 获取验证码倒计时控件
 */
public class CountDownM extends ButtonM {

 private OnClickListener onClickListener = null;
 private CountDownTimer countDownTimer;
 /**
  * 倒计时总时长
  */
 private int countDownSeconds = 60;
 /**
  * 按钮的背景色
  */
 private int backColor = 0;

 public interface OnClickListener{
  void onClick(View v);
 }

 public CountDownM(Context context) {
  this(context, null);
 }

 public CountDownM(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
 }

 public CountDownM(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.countDownM, defStyle, 0);
  if (a != null) {
   //设置背景色
   ColorStateList colorList = a.getColorStateList(R.styleable.countDownM_backColor);
   if (colorList != null) {
    backColor = colorList.getColorForState(getDrawableState(), 0);
    if (backColor != 0) {
     setBackColor(backColor);
    }
   } else {
    setBackColor(getResources().getColor(R.color.mainColor));
   }
   //获取倒计时总时长
   int countDownSeconds = a.getInteger(R.styleable.countDownM_countDownSeconds, 60);
   setCountDownSeconds(countDownSeconds);
   a.recycle();
  }
  //设置文字颜色
  setTextColor(getResources().getColor(android.R.color.white));
  //设置位置相关属性
  setGravity(Gravity.CENTER);
  setPadding(ConvertM.dp2px(context, 8), 0, ConvertM.dp2px(context, 8), 0);
  setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    if (onClickListener != null) {
     onClickListener.onClick(v);
    }
    //点击后开始计时
    start();
   }
  });
 }

 /**
  * 设置倒计时总时长
  * @param countDownSeconds
  */
 public void setCountDownSeconds(int countDownSeconds){
  this.countDownSeconds = countDownSeconds;
 }

 /**
  * 设置背景色
  * @param backColor
  */
 @Override
 public void setBackColor(int backColor) {
  this.backColor = backColor;
  super.setBackColor(backColor);
 }

 /**
  * 停止倒计时
  */
 public void stop(){
  countDownTimer.cancel();
  resetButton();
 }

 public void setOnClickListener(OnClickListener l){
  this.onClickListener = l;
 }

 private void start(){
  setEnabled(false);//设置不能点击
  countDownTimer = new CountDownTimer(countDownSeconds * 1000, 1000) {
   @Override
   public void onTick(long millisUntilFinished) {
    setText(millisUntilFinished / 1000 + getResources().getString(R.string.count_down_m_recapture_after));//设置倒计时时间
    //设置按钮为灰色,这时是不能点击的
    CountDownM.super.setBackColor(Color.GRAY);
    Spannable span = new SpannableString(getText().toString());//获取按钮的文字
    span.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//讲倒计时时间显示为红色
    setText(span);
   }

   @Override
   public void onFinish() {
    resetButton();
   }
  };
  countDownTimer.start();
 }

 private void resetButton(){
  setText(getResources().getString(R.string.count_down_m_recapture));
  setEnabled(true);//重新获得点击
  if (backColor != 0) {
   setBackColor(backColor);//还原背景色
  } else {
   setBackColor(getResources().getColor(R.color.mainColor));//还原背景色
  }
 }
}

代码比较短,这里面继承了ButtonM,有不了解的可以看一下我之前的博客
Android自定义控件系列(一)—Button七十二变

全部代码已托管到开源中国的码云上,欢迎下载,地址:https://git.oschina.net/landptf/landptf.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android样式和主题之选择器的实例讲解

今天小编就为大家分享一篇关于Android样式和主题之选择器的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Android应用动态修改主题的方法示例

今天小编就为大家分享一篇关于Android应用动态修改主题的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter 网络请求框架封装详解

这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Flutter倒计时/计时器的实现代码

这篇文章主要介绍了Flutter倒计时/计时器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android使用google breakpad捕获分析native cash

这篇文章主要介绍了Android使用google breakpad捕获分析native cash 的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Flutter WebView与JS互相调用简易指南

这篇文章主要介绍了详解Flutter WebView与JS互相调用简易指南,分为JS调用Flutter和Flutter调用JS,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android开发实现ListView和adapter配合显示图片和文字列表功能示例

这篇文章主要介绍了Android开发实现ListView和adapter配合显示图片和文字列表功能,涉及Android使用ListView结合adapter适配器实现图文显示功能相关的布局、解析、权限控制等操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Android文字基线Baseline算法的使用讲解

今天小编就为大家分享一篇关于Android文字基线Baseline算法的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter自定义实现神奇动效的卡片切换视图的示例代码

这篇文章主要介绍了Flutter自定义实现神奇动效的卡片切换视图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现自定义滑动刻度尺方法示例

这篇文章主要给大家介绍了关于Android实现自定义滑动刻度尺的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享
查看更多