Andorid实现点击获取验证码倒计时效果

我们在开发中经常用到倒计时的功能,比如发送验证码后,倒计时60s再进行验证码的获取,为了方便以后使用,这里做个记录,讲讲倒计时器的实现。

1、先进行倒计时工具类的封装

public class CountDownTimerUtils extends CountDownTimer {
  private TextView mTextView;

  /**
   * @param textView     The TextView
   *
   *
   * @param millisInFuture  The number of millis in the future from the call
   *             to {@link #start()} until the countdown is done and {@link #onFinish()}
   *             is called.
   * @param countDownInterval The interval along the way to receiver
   *             {@link #onTick(long)} callbacks.
   */
  public CountDownTimerUtils(TextView textView, long millisInFuture, long countDownInterval) {
    super(millisInFuture, countDownInterval);
    this.mTextView = textView;
  }

  /**
   * 倒计时期间会调用
   * @param millisUntilFinished
   */
  @Override
  public void onTick(long millisUntilFinished) {
    mTextView.setClickable(false); //设置不可点击
    mTextView.setText(millisUntilFinished / 1000 + "秒"); //设置倒计时时间
    mTextView.setBackgroundResource(R.drawable.shape_verify_btn_press); //设置按钮为灰色,这时是不能点击的

    SpannableString spannableString = new SpannableString(mTextView.getText().toString()); //获取按钮上的文字
    ForegroundColorSpan span = new ForegroundColorSpan(Color.RED);
    /**
     * public void setSpan(Object what, int start, int end, int flags) {
     * 主要是start跟end,start是起始位置,无论中英文,都算一个。
     * 从0开始计算起。end是结束位置,所以处理的文字,包含开始位置,但不包含结束位置。
     */
    spannableString.setSpan(span, 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//将倒计时的时间设置为红色
    mTextView.setText(spannableString);
  }

  /**
   * 倒计时完成后调用
   */
  @Override
  public void onFinish() {
    mTextView.setText("重新获取验证码");
    mTextView.setClickable(true);//重新获得点击
    mTextView.setBackgroundResource(R.drawable.shape_verify_btn_normal); //还原背景色
  }
}

让这个工具类继承CountDownTimer,然后把显示倒计时的View传进去,在倒计时期间会调用onTick方法,在这个方法里面对View的倒计时界面进行刷新,倒计时结束后,会调用onFinish方法,在里面恢复View的状态即可。

2、布局文件

未点击获取验证码时的view布局 shape_verify_btn_normal.xml

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle" >

  <!-- 填充的颜色:这里设置背景透明 -->
  <solid android:color="@color/maincolor" />
  <!-- 边框的颜色 :不能和窗口背景色一样-->
  <stroke
    android:width="1dp"
    android:color="@color/white" />
  <!-- 设置按钮的四个角为弧形 -->
  <!-- android:radius 弧形的半径 -->
  <corners android:radius="5dip" />

  <!-- padding:Button里面的文字与Button边界的间隔 -->
  <padding
    android:bottom="5dp"
    android:left="5dp"
    android:right="5dp"
    android:top="5dp" />
</shape>

点击获取验证码之后的view布局  shape_verify_btn_press.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle" >

  <!-- 填充的颜色:这里设置背景透明 -->
  <solid android:color="@color/graywhite" />
  <!-- 边框的颜色 :不能和窗口背景色一样-->
  <stroke
    android:width="1dp"
    android:color="@color/white" />
  <!-- 设置按钮的四个角为弧形 -->
  <!-- android:radius 弧形的半径 -->
  <corners android:radius="5dip" />

  <!-- padding:Button里面的文字与Button边界的间隔 -->
  <padding
    android:bottom="5dp"
    android:left="5dp"
    android:right="5dp"
    android:top="5dp" />
</shape>

整个界面的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@drawable/login_bg">

  <EditText
    android:id="@+id/rst_phone_number"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:inputType="phone"
    android:hint="@string/phone_number"
    android:textSize="16sp"
    android:textColor="@color/black"
    android:singleLine="true"
    android:background="@drawable/shape_form"
    android:textCursorDrawable="@drawable/text_cursor"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:layout_marginTop="30dp"
    android:layout_gravity="center_vertical"/>

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:layout_marginTop="15dp"
    android:orientation="horizontal">

    <EditText
      android:id="@+id/rst_verify_code"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:layout_weight="1"
      android:inputType="number"
      android:hint="@string/rst_verify_code"
      android:textSize="16sp"
      android:textColor="@color/black"
      android:singleLine="true"
      android:background="@drawable/shape_form"
      android:textCursorDrawable="@drawable/text_cursor" />

    <TextView
      android:id="@+id/rst_send_code"
      android:layout_width="130dp"
      android:layout_height="match_parent"
      android:text="@string/rst_send_code"
      android:textSize="13sp"
      android:textColor="@color/white"
      android:gravity="center"
      android:layout_marginLeft="10dp"
      android:background="@drawable/shape_verify_btn_normal"/>

  </LinearLayout>

  <Button
    android:id="@+id/rst_next_step"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_margin="30dp"
    android:text="@string/rst_next_step"
    android:textSize="15sp"
    android:textColor="@color/white"
    android:background="@drawable/shape_btn"/>

</LinearLayout>

这里布局有个问题,因为获取验证码这个TextView中的字会在倒计时期间有变化,而且每次字的变化长度不一样,如果把它的layout_width设为wrap_content,那么这个TextView的长度会变化,影响界面美观,所以可以把它的长度固定,然后把验证码输入框的layout_weight设为1,这样就可以了。

3、具体使用方法

// 发送成功进入倒计时
countDownTimer = new CountDownTimerUtils(tv_send_code, 60000, 1000);
countDownTimer.start();

其中60000代表要倒计时的时长,即60s;1000代表每次递减1s。

以上就是具体的实现过程,下面附几张效果图!

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

(0)

相关推荐

  • Andorid自定义attr的各种坑

    在开发Andorid应用程序中,经常会自定义View来实现各种各样炫酷的效果,在实现这吊炸天效果的同时,我们往往会定义很多attr属性,这样就可以在XML中配置我们想要的属性值,以下就是定义属性值可能遇到的各种坑. 大家都知道怎么定义attr属性,一般如下: <declare-styleable name="Sample"> <attr name="custom" format="string|reference" />

  • Android 如何使用log4j及注意事项

     Android 使用log4j 前言: 如果要直接在android工程中使用log4j,是有点问题的,会报如下的错: 11-23 09:44:56.947: D/dalvikvm(1585): GC_FOR_MALLOC freed 3278 objects / 311568 bytes in 31ms rejecting opcode 0x21 at 0x000a rejected Lorg/apache/log4j/config/PropertySetter;.getPropertyDes

  • Android中html.fromhtml的使用方法

    Android中html.fromhtml 在android中,有一个容易遗忘的Html.fromhtml方法,意思是可以将比如文本 框中的字符串进行HTML格式化,支持的还是很多的, 但要注意的是要在string.xml中用<!--cdata-->去转义,比如: <string name="htmlFormattedText"> <![CDATA[ Text with markup for [b]bold[/b] and [i]italic[/i] te

  • android判断手机是否安装地图应用实现跳转到该地图应用

    前言 现在很多应用都会用到地图,但是我们肯定不想自己的app中还要弄个导航神马的,所以第三方的地图也为我们开辟了一条捷径,直接将数据传输到地图应用,让第三方的地图帮我们来做好这一切.现在比较流行的地图应用百度地图,高德地图,腾讯地图,在这里我用高德地图作为测试. 首先你需要判断手机中有没有安装地图应用,在这里提供一个方法: 判断手机是否安装某一应用 上述的packagename是你要检测的应用的包名,怎么查看包名请自行百度哈! 判断好之后,我们可以定义,当有地图应用的时候,就跳转到地图应用,当无

  • Android编程实现自定义toast示例

    本文实例讲述了Android编程实现自定义toast.分享给大家供大家参考,具体如下: 效果图: 代码: //自定义布局的toast customViewToast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast toast = Toast.makeText(ToastTest.this, "top", Toast.LENGTH_SHORT); /

  • Android 中的两端对齐实例详解

    在android中的webview中,可以对文本内容进行对齐,具体方法如下 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String htmlText = " %s "

  • Android自定义View实现水波纹引导动画

    一.实现效果图 关于贝塞尔曲线 二.实现代码 1.自定义view package com.czhappy.showintroduce.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.grap

  • Android Material加载进度条制作代码

    最近看了几款APP的加载进度都是这种风格,感觉还不错,在网上找了一些资料,自己小练兵了一把: 主要运用的开源框架: /ViewPagerIndicator_library  主要就是tab页切换指示器 /ptr-lib 进度条 下载地址:https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 一.使用方法 布局文件 <?xml version="1.0" encoding="utf-8"?>

  • Andorid TextView字幕效果实例

    一.效果图 二.代码 复制代码 代码如下: public class TextSubView extends TextView { private TextPaint mPaint; public TextSubView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new TextPaint(getPaint()); mPaint.setStyle(TextPaint.Style.STROKE);

  • Andorid 日历控件库,可左右滑动,显示公历,农历,节假日等功能

    封面图:  demo效果图 源码目录结构         Features 日历左右滑动. 显示阳历,农历,节假日和二十四节气 实现对某月日期的单选或者多选. 使用步骤 Gradle Dependency Add the library to your project build.gradle compile 'com.joybar.calendar:librarycalendar:1.0.4' Sample Usage 实现OnPageChangeListener和OnDateClickLis

  • Android实现放大镜效果的方法实例(附源码)

    前言 应该有很多用过英语应用的同学都看多一个放大镜的效果,就是选中一段文字后,会有一个放大镜,这个究竟怎么实现的呢,我们今天来分析分析. 源码分析 public class ShaderView extends View { private final Bitmap bitmap; private final ShapeDrawable drawable; // 放大镜的半径 private static final int RADIUS = 80; // 放大倍数 private static

  • Android手机注册登录时获取验证码之后倒计时功能(知识点总结)

    app注册界面经常会遇到一个场景:手机注册,点击获取验证码,验证码发送成功之后,开始倒计时 具体代码如下所示: private TimerTask timerTask; private Timer timer; private int time = 5000;//五秒 private int timess; /** * 开始倒计时 */ private void startTimer() { timess = time/1000; tvTime.setText(timess+"S");

  • Android点击EditText文本框之外任何地方隐藏键盘的解决办法

    1,实现方法一: 通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/traceroute_rootview" android:layout_width="fill_parent" android:

  • Android自定义Material进度条效果

    首先看下效果图 布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_par

  • Android中点击隐藏软键盘最佳方法

    实现功能:点击EditText,软键盘出现并且不会隐藏,点击或者触摸EditText以外的其他任何区域,软键盘被隐藏: 1.重写dispatchTouchEvent()方法,获取当前触摸事件为DOWN的时候隐藏软键盘 @Override public boolean dispatchTouchEvent(MotionEvent ev) { //Finger touch screen event if (ev.getAction() == MotionEvent.ACTION_DOWN) { //

随机推荐