本文实例为大家分享了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实现短信验证码秒表倒计时功能相关推荐

  1. android自定义秒表,Android自定义Chronometer实现短信验证码秒表倒计时功能

    本文实例为大家分享了Chronometer实现倒计时功能,Android提供了实现按照秒计时的API,供大家参考,具体内容如下 一.自定义ChronometerView 继续自TextView 主要原 ...

  2. Android短信验证(手机号注册,绑定手机号获取验证码)实例

    今天写一个常见的功能--手机app中注册或绑定手机号的获取验证码的功能.也就是短信验证功能 具体效果就是,你在注册界面填写手机号,点击获取验证码按钮,---然后会收到验证短信,填入验证码后点击注册 ...

  3. 短信验证(手机号注册,绑定手机号获取验证码)

    今天写一个常见的功能--手机app中注册或绑定手机号的获取验证码的功能.也就是短信验证功能 具体效果就是,你在注册界面填写手机号,点击获取验证码按钮,---然后会收到验证短信,填入验证码后点击注册按钮 ...

  4. php中短信验证大致流程,实现php手机短信验证功能的基本思路

    现在很多网站为了避免用户烂注册,都在注册环节添加有手机短信验证功能,用户注册时需要短信验证码才可以,那么这种手机短信验证功能是如何实现的呢?其基本思路是什么呢?下面乐信小编就来为大家介绍下: 实现手机 ...

  5. 榛子云短信验证平台与springboot集成的短信验证

    登录 - 榛子云短信用户系统 (zhenzikj.com) 上面是登录榛子云短信验证平台的入口,此平台的短信大概为3.1分一条短信. 如何与spring boot进行集成呢,我以注册为例来慢慢讲解 1 ...

  6. 【django】用户注册时短信验证码校验、避免频繁发送短信验证码【17】

    注册时短信验证后端逻辑 class CheckSMScodeView(View):def get(self,request,phone):'''用户注册时短信验证码的校验功能:param reques ...

  7. Android实现获取验证码的倒计时功能

    开发中经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的. 实现如下: CountDownTimerUtils.java package com.zhw.my ...

  8. php短信验证 免费_php如何实现发送短信验证码(图文)

    这篇文章分享给大家的内容是关于php发送短信验证码,内容很有参考价值,希望可以帮到有需要的小伙伴. 业务: 手机端点击发送验证码,请求发送到php端,由php调用第三方平台(我们使用的是榛子云短信ht ...

  9. 云之讯短信验证视频php,云之讯短信接口GO实现

    将项目变量appId, accountSId和token使用自己的替换掉就可以了. 发送信息时直接调用函数SendSMS即可,传入参数电话号码,模板ID以及模板中参数.由于云之讯的参数是以逗号分隔的, ...

最新文章

  1. Failed to resolve:com.android.support:appcompat-v7
  2. 项目后台的最新认识和对MVC封装性、可维护性的更深刻认识!
  3. 获取dbgrid的行索引
  4. 鼓作气学会“一致性哈希”,就靠这 18 张图了
  5. 在某游戏公司面试游戏运营的感受
  6. 构建创业公司突击小团队
  7. 小朋友学C++(1)
  8. 机器学习——支持向量机SVM之非线性模型(低维到高维映射)
  9. razor 写入html标记,如何在Razor中编写“ Html.BeginForm”
  10. maven集成命令-U -B -P -e -X
  11. ​Redis分布式锁,你真的用对了吗?
  12. Bootstrap 输入框组中控件的尺寸
  13. 开发环境配置--Ubuntu+Qt4+OpenCV(二)
  14. 《复杂网络》的课程笔记,复杂网络,小世界网络,随机网络,无标度网络,入门
  15. 计算机技术研究生省考,省考,硕士学历计算机技术(专硕)可以报计算机类的职位吗...
  16. 微信支付开通流程,及微信支付商户号申请详细流程介绍
  17. Network的简单介绍(在爬虫中经常用到)
  18. 任正非:华为云不能简单模仿阿里、亚马逊,要有所为有所不为|CEO说
  19. Matlab中的plotyy细讲(双坐标图)
  20. python命令行输入参数_Python命令行参数处理

热门文章

  1. 用了的都说好 | 详解16个Pandas函数,让你的 “数据清洗” 能力提高100倍!
  2. jsp页面标签选择器
  3. nginx 部署vue 3
  4. jquery.datepick使用
  5. C++ OpenCV【解决putText不能显示中文】
  6. R语言学习心得-plot函数绘制双Y轴图像
  7. js把毫秒数转为天,小时分钟秒,比如10130毫秒转换为xx天xx小时xx分钟
  8. HP 畅游人系列系统恢复
  9. python爬取B站文章信息并存入数据库
  10. 使用 Python 深度学习方法对电影评论进行情绪预测