验证码按钮在项目的使用频率应该是100%,现在大多数应用都会采用手机号码登陆,通常都会支持发送验证码登陆的功能。

我在项目中也遇到这样的功能,特别在忘记密码的界面,我注意到一点:当发送验证码之后,要60秒之后才能再发,如果退出界面,重新进入同样需要等待时间结束。

其中分析一下流程应该是这样的:

  1. 倒计时按钮点击:发送验证码
  2. 发送验证码成功:禁用按钮 & 倒计时开始
  3. 倒计时结束之后:恢复按钮

针对这种场景进行分析,如果采用继承Button的方式对项目耦合性太强了,以后不需要移除也特别麻烦。所以抽象一个工具类进行对Button自动化设置会更好,以后不需要了可以随时移除然后重新实现逻辑。

既然是倒计时功能,所以项目需要使用到相关的技术,在安卓开发中,我总结了如下几种倒计时方法:

  1. Handler实现倒计时(sendEmptyMessageDelayed方法)
  2. Thread实现倒计时
  3. View.postDelayed()实现倒计时
  4. CountDownTimer实现倒计时

CountDownTimer是安卓专门未倒计时设计的一个类,使用起来也非常方便,所以我也选择它作为实现的基础。他是一个抽象类,使用时需要继承并实现onTick()和onFinish()方法。

/*** 构造函数(millisInFuture:倒计时总时间,countDownInterval:触发回调的时间间隔)*/
public CountDownTimer(long millisInFuture, long countDownInterval)/*** 每次倒计时都会触发回调,millisUntilFinished表示剩余的时间。*/
public abstract void onTick(long millisUntilFinished);/*** 倒计时结束后回调*/
public abstract void onFinish();

再想想自己设计这个工具类的具体思想:

  1. autoHandleWhenActivityCreate(Button indicator) :在onCreate()中调用,绑定按钮并初始化。
  2. autoHandleWhenActivityDestroy() :在onDestroy()中调用,因为CountDownTimer本质上是Handler实现的,所以处理不当会造成内存泄漏。
  3. autoHandleRequestStartTimer() :调用此方法会立即开始倒计时,按钮的倒计时文字将会变化。

贴一贴工具类的具体使用方法:

public class ForgetActivity extends AppCompatActivity {Button uaSendCode;// 第一步:创建静态计时器类(当前界面有效,重复进入倒计时依然继续)private static CountDownTimer mCountDown = new CountDownTimer(60, "发送验证码(%s)", "发送验证码", R.drawable.register_bg_send, R.drawable.register_bg_unsend);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.forget_activity_main);uaSendCode = findViewById(R.id.uaSendCode);// 第二步:绑定按钮mCountDown.autoHandleWhenActivityCreate(uaSendCode);uaSendCode.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 注意:启动计时器需要调用下面的方法mCountDown.autoHandleRequestStartTimer();}});}@Overrideprotected void onDestroy() {super.onDestroy();//第三步:释放内部引用,防止内存泄漏mCountDown.autoHandleWhenActivityDestroy();}
}

下面贴上具体实现的逻辑:

package com.anbang.family.library;import android.view.View;
import android.widget.Button;/*** 按钮倒计时*/
public class CountDownTimer extends android.os.CountDownTimer {private Button mIndicator;private String mCountDownFormatString = "发送验证码(%s)";private String mCountDownFinishString = "发送验证码";private int mEnableDrawable;private int mUnableDrawable;private int mSecond;private int mCount;/*** 是否启动过计时器(mCount一开始不为0,所以配合这个标志做判断是否start计时器)*/private boolean mAlreadyStart = false;public CountDownTimer(int second, String countDownFormatString, String countDownFinishString, int enableDrawable, int unableDrawable) {super((second <= 0 ? 60 : second) * 1000, 1000);this.mSecond = second;this.mCount = second;this.mCountDownFormatString = countDownFormatString;this.mCountDownFinishString = countDownFinishString;this.mEnableDrawable = enableDrawable;this.mUnableDrawable = unableDrawable;}public int getmCount() {return mCount;}public void autoHandleWhenActivityCreate(Button indicator) {this.mIndicator = indicator;if (mCount <= 0 || !mAlreadyStart) {mIndicator.setEnabled(true);mIndicator.setText(mCountDownFinishString);mIndicator.setBackgroundResource(mEnableDrawable);} else {mIndicator.setEnabled(false);mIndicator.setBackgroundResource(mUnableDrawable);mIndicator.setText(String.format(mCountDownFormatString, mCount));}}public void autoHandleWhenActivityDestroy() {mIndicator = null;}public void autoHandleRequestStartTimer() {if (mCount <= 0 || !mAlreadyStart) {mAlreadyStart = true;mCount = mSecond <= 0 ? 60 : mSecond;if (mIndicator != null) {unableIndicator(mCount);}start();}}@Overridepublic void onTick(long millisUntilFinished) {mCount--;unableIndicator((int) (millisUntilFinished / 1000));}@Overridepublic void onFinish() {enableIndicator();}private void unableIndicator(int second) {if (mIndicator != null) {mIndicator.setEnabled(false);mIndicator.setBackgroundResource(mUnableDrawable);mIndicator.setText(String.format(mCountDownFormatString, second));}}private void enableIndicator() {if (mIndicator != null) {mIndicator.setEnabled(true);mIndicator.setText(mCountDownFinishString);mIndicator.setBackgroundResource(mEnableDrawable);}}
}

转载于:https://www.cnblogs.com/nicojerry/p/10350409.html

【安卓基础】倒计时按钮封装(验证码倒计时按钮)相关推荐

  1. Flutter布局锦囊---验证码倒计时

    设计给的效果如下: 拿到设计后,先把整体拆分成几个部分: "获取验证码按钮",可以通过点击按钮来获取验证码. 然后就可以开始进行编码了. 第1步:绘制组件树 第2步:实现" ...

  2. vue获取手机验证码60秒倒计时,不能点击按钮

    vue获取手机验证码60秒倒计时,不能点击按钮 export const resend = element => {console.log(element)var num = 60var tim ...

  3. 获取验证码按钮 点击后开始倒计时

    <script src="/jquery-2.1.4.min.js"></script> <!-- 引入bootstrap --> <li ...

  4. android 倒计时封装,react native中的聊天气泡及timer封装成的发送验证码倒计时

    其实,今天我想把我近期遇到的坑都总结一下: 1.goBack的跨页面跳转,又两种方法,一可以像兔哥那样修改navigation源码,二可以用navigationActions 2.父子组件的传值,一可 ...

  5. 【Axure RP9基础】CSDN登录框(二)之验证码倒计时

    [Axure RP9基础]CSDN登录框(二)之验证码倒计时 需求: 先来看一下我们对点击验证码的需求: 手机号为空,提示:手机号不能为空! 手机号格式不正确,提示:手机号码格式不正确 手机号输入11 ...

  6. Android设置text按钮,安卓基础控件使用(TextView、Button、ImageView、EditText)

    一.文本控件TextView 1.布局文件 android:text="@string/content" android:layout_width="wrap_conte ...

  7. Android验证码倒计时实现方式总结

    Android验证码倒计时实现方式总结 几乎所有的APP里面都有验证码倒计时按钮,自己在项目中也尝试,简单总结为以下三种: 1.使用线程和Handler的方式,定时刷新倒计时数字,这种方式容易导致内存 ...

  8. 微信小程序好看的输入信息界面——发送验证码倒计时

    微信小程序好看的输入信息界面 简介 输入个人信息界面,录入个人信息等都可以使用到这个界面: 1.输入信息的布局界面 2.选择大陆还是港澳台的手机号码 3.输入手机号码, 4.获取验证码的60S倒计时, ...

  9. 发送验证码倒计时效果实现

    目录 前言 一.应用场景 二.代码演示 三. 效果演示 总结 前言 今天用@vueuse/core中提供的一个方法,实现发送验证码时倒计时的一个效果.这样的场景使我们经常会见到的,一起来看一下如何实现 ...

最新文章

  1. 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式
  2. TikTok游戏话题浏览上涨,预示出海新机会
  3. js正则贪婪模式_C# 正则表达式贪婪模式案例
  4. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口 6...
  5. 入门demo---Mybatis学习笔记(三)
  6. js中在表格中增加一列的方法_Excel表格中需要提取一列内容末尾的数字,同事分分钟完成...
  7. phppage类封装分页功能_php显示页码分页类的封装
  8. 带参方法的使用 0908
  9. qq传文件 udp_软考网络工程师备考-10:网络互连与互联网3-TCPUDP
  10. Android 获取唯一机器码的代码
  11. ABAP - 3D Graphs with SAP
  12. 根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
  13. Python爬虫爬取豆瓣图书的信息和封面,放入MySQL数据库中。
  14. Java性能优化的五种方式,让你的Java程序更快、更稳定!
  15. Java实现 蓝桥杯VIP 算法提高 盾神与砝码称重
  16. 《必然》二、奔跑吧,所有人都是菜鸡
  17. 【OpenGrok代码搜索引擎】四、OpenGrok使用指南
  18. 易班开放平台授权机制理解以及使用
  19. 【渝粤教育】电大中专Office办公软件 (2)_1作业 题库
  20. 实现HTML页面动态处理

热门文章

  1. 诛天者 pat basic 练习五十四 求平均值 测试点2错误
  2. 人工智能助力催收智能化、高效化
  3. 关于laya的声音问题
  4. 微服务:注册中心的作用
  5. 计算机硬件结构六大部分,第六章计算机硬件.ppt
  6. 应用之星,屌丝逆袭之APP开发神器
  7. 问题 F: 【递推】军事情报
  8. Ubuntu18.04设置虚拟内存
  9. “降频门”终结篇 你真的会因为续航给手机降频吗?
  10. 淀粉胶消泡剂来了,你的泡沫消了吗?