Android获取验证码倒计时显示效果
程序员文章站
2024-03-04 15:53:29
前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式。
虽然最近写的都比较简单和基础,不过简单不代表熟悉,基础不代表就...
前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式。
虽然最近写的都比较简单和基础,不过简单不代表熟悉,基础不代表就会,大牛绕过,哈,中牛小牛也可以绕过,这个是写给初学者的。
先搞个效果图。
代码实现方式也超级简单啦,这里首推第一种实现方式,而且也是比较适合大家的,就是通过直接继承countdowntimer来实现。
对于countdowntimer这个类很简单,继承它的时候必须重写构造方法和实现其虚拟方法。
构造方法的两个参数分别是(倒计时开始时间,间隔时间)
另外两个方法分别是ontick(现在还剩的时间),计时结束后你想做的时间可以在onfinish()中做。
值的注意的是,所有的时间都是以毫秒形式来做的,所以在你使用的时候要记得整除1000取商。
不过由于我使用的是私有内部类的方式对外部类存在引用,为了防止内存泄漏,在activity销毁的时候应该注意对其置空,同样我们也应该避免重复创建对象。
另外一种方式还是使用我们常用的handler + thread的方式来实现。不过实现的时候同样要非常小心内存泄漏,因为如果用户在销毁activity的时候应该注意让其计时子线程不再循环,这个可以通过设置一个tag标签对其判断。
这样在销毁的时候把这个tag标签置为false,结束线程的执行!
下面是实现代码:
package com.example.nanchen.timerdemo; import android.os.bundle; import android.os.countdowntimer; import android.os.handler; import android.os.message; import android.support.v7.app.appcompatactivity; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; public class mainactivity extends appcompatactivity { private button mbtngetcode; private timecount mtimecount; private button mbtngetcode2; private boolean timeflag = true; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mbtngetcode = (button) findviewbyid(r.id.main_btn_get_code); mbtngetcode.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { mtimecount = null; mtimecount = new timecount(60 * 1000, 1000); mtimecount.start(); } }); mbtngetcode2 = (button) findviewbyid(r.id.main_btn_get_code_2); mbtngetcode2.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { mbtngetcode2.setclickable(false); mbtngetcode2.setbackgroundcolor(getresources().getcolor(r.color.btn_unable)); timeflag = true; new thread() { @override public void run() { super.run(); for (int i = 59; i >= 0 && timeflag; i--) { try { sleep(1000); message msg = message.obtain(); msg.what = i; mhandler.sendmessage(msg); } catch (interruptedexception e) { e.printstacktrace(); } } } }.start(); } }); } private handler mhandler = new handler() { @override public void handlemessage(message msg) { super.handlemessage(msg); if (msg.what > 0) { mbtngetcode2.settext("(" + msg.what + ")秒后重试"); } else { mbtngetcode2.settext("获取验证码"); mbtngetcode2.setclickable(true); mbtngetcode2.setbackgroundcolor(getresources().getcolor(r.color.coloraccent)); } } }; /** * activity 销毁的时候注意把所有引用置为空,防止内存泄漏 */ @override protected void ondestroy() { super.ondestroy(); mtimecount = null; timeflag = false; } /** * 实现倒计时的类 */ private class timecount extends countdowntimer { /** * @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 receive * {@link #ontick(long)} callbacks. */ public timecount(long millisinfuture, long countdowninterval) { super(millisinfuture, countdowninterval); } /** * 计时过程显示 按钮不可用 设置为灰色 * * @param millisuntilfinished */ @override public void ontick(long millisuntilfinished) { mbtngetcode.setclickable(false); mbtngetcode.setbackgroundcolor(getresources().getcolor(r.color.btn_unable)); mbtngetcode.settext("(" + millisuntilfinished / 1000 + ")秒后重试"); } /** * 计时结束调用 */ @override public void onfinish() { mbtngetcode.setclickable(true); mbtngetcode.settext("获取验证码方式1"); mbtngetcode.setbackgroundcolor(getresources().getcolor(r.color.colorprimarydark)); } } }
简单看一下xml文件
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.nanchen.timerdemo.mainactivity"> <button android:layout_margintop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/main_btn_get_code" android:text="获取验证码方式1" android:background="@color/colorprimarydark"/> <textview android:layout_width="match_parent" android:layout_height="1dp" android:id="@+id/main_line1" android:background="@color/btn_unable" android:layout_below="@+id/main_btn_get_code" android:layout_margintop="10dp"/> <button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/main_line1" android:layout_margintop="10dp" android:text="获取验证码方式2" android:id="@+id/main_btn_get_code_2" android:background="@color/coloraccent"/> </relativelayout>
写在最后:虽然代码和实现都非常简单,你可能不费吹灰之力,不过倘若转载的话,还是留个本文链接吧~thank you!
github链接:https://github.com/nanchen2251/timerdemo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。