欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-11-12 22:13:22
今天给大家带来一个新的控件——验证码倒计时,先看下效果图 1 效果演示 2 使用方式

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

1 效果演示

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

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七十二变

全部代码已托管到开源中国的码云上,欢迎下载,地址:

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