android 短信验证计时,Android自定义Chronometer实现短信验证码秒表倒计时功能
本文实例为大家分享了chronometer实现倒计时功能,android提供了实现按照秒计时的api,供大家参考,具体内容如下
一、自定义chronometerview 继续自textview
主要原理:先设置一个基准倒计时时间mbaseseconds,内置handler 每隔1s发送一个空消息,mremainseconds--,同时刷新界面视图,回调给外部调用者,只到为零。外部调用者可通过start()/pause()/stop()来控制计时器的工作状态。
可以app中发送短信验证码的场景为例,做了一个很粗糙的界面,但功能都实现了。
/**
* @name 倒计时器(类似妙表倒数计时,支持暂停、停止、重新开始)
* @author fanjb
* @date 2015年11月6日
*/
public class chronometerview extends textview {
/**
* a callback that notifies when the chronometer has decremented on its own.
*
* @author fanjb
*/
public interface ontickchangelistener {
/**
* remain seconds changed
*
* @param view
* @param remainseconds
*/
public void ontickchanged(chronometerview view, long remainseconds);
}
private long mbase;
private long mremainseconds;
private boolean mstarted;
private boolean mrestart;
private boolean mvisible;
private boolean misenable;
private ontickchangelistener mticklistener;
public chronometerview(context context) {
this(context, null);
}
public chronometerview(context context, attributeset attrs) {
super(context, attrs, 0);
}
public chronometerview(context context, attributeset attrs, int defstyleattr) {
super(context, attrs, defstyleattr);
updatetext(mremainseconds);
}
@override
protected void onwindowvisibilitychanged(int visibility) {
super.onwindowvisibilitychanged(visibility);
mvisible = visibility == visible;
updatestatus();
}
@override
protected void ondetachedfromwindow() {
super.ondetachedfromwindow();
mvisible = false;
updatestatus();
}
/**
* 启动计时器
*/
public void start() {
if (mrestart && !mstarted) {
mremainseconds = mbase;
}
mstarted = true;
updatestatus();
}
/**
* 暂停计时器
*/
public void pause() {
if (mstarted) {
mstarted = mrestart = false;
updatestatus();
}
}
/**
* 停止计时器,再次调用 start()重新启动
*/
public void stop() {
mstarted = false;
mrestart = true;
updatestatus();
updatetext(mremainseconds = 0);
dispatchticklistener();
}
/**
* 刷新内部状态
*/
private void updatestatus() {
boolean isenable = mvisible && mstarted;
if (misenable != isenable) {
if (isenable) {
mhandler.sendmessage(message.obtain(mhandler, tick_what));
} else {
mhandler.removemessages(tick_what);
}
misenable = isenable;
}
}
private static final int tick_what = 1;
private handler mhandler = new handler() {
public void handlemessage(android.os.message msg) {
if (mremainseconds > 0) {
updatetext(--mremainseconds);
dispatchticklistener();
sendmessagedelayed(message.obtain(this, tick_what), 1000);
}
}
};
private void updatetext(long now) {
string text = dateutils.formatelapsedtime(now);
settext(text);
}
/**
* 在未启动状态下设置开始倒计时时间
*
* @param baseseconds
*/
public void setbaseseconds(long baseseconds) {
if (baseseconds > 0 && baseseconds != mbase && !mstarted) {
mbase = mremainseconds = baseseconds;
updatetext(mremainseconds);
}
}
/**
* 剩余时间
*
* @return
*/
public long getremainseconds() {
return mremainseconds;
}
public void setontickchangelistener(ontickchangelistener listener) {
mticklistener = listener;
}
public ontickchangelistener getticklistener() {
return mticklistener;
}
private void dispatchticklistener() {
if (mticklistener != null) {
mticklistener.ontickchanged(this, getremainseconds());
}
}
@override
public void oninitializeaccessibilityevent(accessibilityevent event) {
super.oninitializeaccessibilityevent(event);
event.setclassname(chronometerview.class.getname());
}
@override
public void oninitializeaccessibilitynodeinfo(accessibilitynodeinfo info) {
super.oninitializeaccessibilitynodeinfo(info);
info.setclassname(chronometer.class.getname());
}
}
二、xml 中没有加入自定义的控件属性,同textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
android:id="@+id/chronometer_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="5dp"
android:background="@drawable/chronometer_view_bg"
android:enabled="true"
android:text="00:00" />
android:id="@+id/start_chronometer_view_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="5dp"
android:text="start" />
android:id="@+id/pause_chronometer_view_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="5dp"
android:text="pause" />
android:id="@+id/stop_chronometer_view_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="5dp"
android:text="stop" />
三、在activity中做一个简单的测试(可以发送短信验证码的实际应用场景为例)
public class chronometeractivity extends activity {
private chronometerview mchronometerview;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_clock);
// 自定义计时器
if (mchronometerview == null) {
mchronometerview = (chronometerview) findviewbyid(r.id.chronometer_view);
mchronometerview.setbaseseconds(60);
mchronometerview.setontickchangelistener(new ontickchangelistener() {
@override
public void ontickchanged(chronometerview view, long curtimemills) {
system.out.println(curtimemills);
view.setenabled(curtimemills == 0 || curtimemills == 60);
if (curtimemills == 0) {
mchronometerview.settext("重新发送");
}
}
});
mchronometerview.settext("点击发送验证码");
}
findviewbyid(r.id.start_chronometer_view_btn).setonclicklistener(mclicklistener);
findviewbyid(r.id.pause_chronometer_view_btn).setonclicklistener(mclicklistener);
findviewbyid(r.id.stop_chronometer_view_btn).setonclicklistener(mclicklistener);
}
private view.onclicklistener mclicklistener = new onclicklistener() {
@override
public void onclick(view v) {
switch (v.getid()) {
case r.id.start_chronometer_view_btn:
if (mchronometerview != null) {
mchronometerview.start();
}
break;
case r.id.pause_chronometer_view_btn:
if (mchronometerview != null) {
mchronometerview.pause();
}
break;
case r.id.stop_chronometer_view_btn:
if (mchronometerview != null) {
mchronometerview.stop();
}
break;
}
}
};
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。
android 短信验证计时,Android自定义Chronometer实现短信验证码秒表倒计时功能相关推荐
- android自定义秒表,Android自定义Chronometer实现短信验证码秒表倒计时功能
本文实例为大家分享了Chronometer实现倒计时功能,Android提供了实现按照秒计时的API,供大家参考,具体内容如下 一.自定义ChronometerView 继续自TextView 主要原 ...
- Android短信验证(手机号注册,绑定手机号获取验证码)实例
今天写一个常见的功能--手机app中注册或绑定手机号的获取验证码的功能.也就是短信验证功能 具体效果就是,你在注册界面填写手机号,点击获取验证码按钮,---然后会收到验证短信,填入验证码后点击注册 ...
- 短信验证(手机号注册,绑定手机号获取验证码)
今天写一个常见的功能--手机app中注册或绑定手机号的获取验证码的功能.也就是短信验证功能 具体效果就是,你在注册界面填写手机号,点击获取验证码按钮,---然后会收到验证短信,填入验证码后点击注册按钮 ...
- php中短信验证大致流程,实现php手机短信验证功能的基本思路
现在很多网站为了避免用户烂注册,都在注册环节添加有手机短信验证功能,用户注册时需要短信验证码才可以,那么这种手机短信验证功能是如何实现的呢?其基本思路是什么呢?下面乐信小编就来为大家介绍下: 实现手机 ...
- 榛子云短信验证平台与springboot集成的短信验证
登录 - 榛子云短信用户系统 (zhenzikj.com) 上面是登录榛子云短信验证平台的入口,此平台的短信大概为3.1分一条短信. 如何与spring boot进行集成呢,我以注册为例来慢慢讲解 1 ...
- 【django】用户注册时短信验证码校验、避免频繁发送短信验证码【17】
注册时短信验证后端逻辑 class CheckSMScodeView(View):def get(self,request,phone):'''用户注册时短信验证码的校验功能:param reques ...
- Android实现获取验证码的倒计时功能
开发中经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的. 实现如下: CountDownTimerUtils.java package com.zhw.my ...
- php短信验证 免费_php如何实现发送短信验证码(图文)
这篇文章分享给大家的内容是关于php发送短信验证码,内容很有参考价值,希望可以帮到有需要的小伙伴. 业务: 手机端点击发送验证码,请求发送到php端,由php调用第三方平台(我们使用的是榛子云短信ht ...
- 云之讯短信验证视频php,云之讯短信接口GO实现
将项目变量appId, accountSId和token使用自己的替换掉就可以了. 发送信息时直接调用函数SendSMS即可,传入参数电话号码,模板ID以及模板中参数.由于云之讯的参数是以逗号分隔的, ...
最新文章
- Failed to resolve:com.android.support:appcompat-v7
- 项目后台的最新认识和对MVC封装性、可维护性的更深刻认识!
- 获取dbgrid的行索引
- 鼓作气学会“一致性哈希”,就靠这 18 张图了
- 在某游戏公司面试游戏运营的感受
- 构建创业公司突击小团队
- 小朋友学C++(1)
- 机器学习——支持向量机SVM之非线性模型(低维到高维映射)
- razor 写入html标记,如何在Razor中编写“ Html.BeginForm”
- maven集成命令-U -B -P -e -X
- ​Redis分布式锁,你真的用对了吗?
- Bootstrap 输入框组中控件的尺寸
- 开发环境配置--Ubuntu+Qt4+OpenCV(二)
- 《复杂网络》的课程笔记,复杂网络,小世界网络,随机网络,无标度网络,入门
- 计算机技术研究生省考,省考,硕士学历计算机技术(专硕)可以报计算机类的职位吗...
- 微信支付开通流程,及微信支付商户号申请详细流程介绍
- Network的简单介绍(在爬虫中经常用到)
- 任正非:华为云不能简单模仿阿里、亚马逊,要有所为有所不为|CEO说
- Matlab中的plotyy细讲(双坐标图)
- python命令行输入参数_Python命令行参数处理