目前越来越多的app在注册或是进行对应操作时,要求获取短信验证码,在点击了获取短信验证码的按钮后,就是出现倒计时,比如倒计时120S,在倒计时 期间内,按钮点击是无效的,当倒计时结束后,如果你没有获取到验证码,可以再次点击。实现倒计时的方法很多,我们今天就通过继承 android. os.CountDownTimer类来实现!
首先看下我们封装的倒计时工具类,主要为了在多个地方用到的话,用了多个构造方法,就是为了使用更灵活,只要传入对数就可以调用了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
public class MyCountTimer extends CountDownTimer { public static final int TIME_COUNT = 121000 ; //时间防止从119s开始显示(以倒计时120s为例子) private TextView btn; private int endStrRid; private int normalColor, timingColor; //未计时的文字颜色,计时期间的文字颜色 /** * 参数 millisInFuture 倒计时总时间(如60S,120s等) * 参数 countDownInterval 渐变时间(每次倒计1s) * 参数 btn 点击的按钮(因为Button是TextView子类,为了通用我的参数设置为TextView) * 参数 endStrRid 倒计时结束后,按钮对应显示的文字 */ public MyCountTimer ( long millisInFuture, long countDownInterval, TextView btn, int endStrRid) { super (millisInFuture, countDownInterval); this .btn = btn; this .endStrRid = endStrRid; } /** *参数上面有注释 */ public MyCountTimer (TextView btn, int endStrRid) { super (TIME_COUNT, 1000 ); this .btn = btn; this .endStrRid = endStrRid; } public MyCountTimer (TextView btn) { super (TIME_COUNT, 1000 ); this .btn = btn; this .endStrRid = R.string.txt_getMsgCode_validate; } public MyCountTimer (TextView tv_varify, int normalColor, int timingColor) { this (tv_varify); this .normalColor = normalColor; this .timingColor = timingColor; } // 计时完毕时触发 @Override public void onFinish() { if (normalColor > 0 ){ btn.setTextColor(normalColor); } btn.setText(endStrRid); btn.setEnabled( true ); } // 计时过程显示 @Override public void onTick( long millisUntilFinished) { if (timingColor > 0 ){ btn.setTextColor(timingColor); } btn.setEnabled( false ); btn.setText(millisUntilFinished / 1000 + "s" ); } } |
然后在你要实现倒计时的页面用就可以了:
比如在AcvitityA中点击倒时间的按钮
Button smsBtn=findViewById(R.id…..);
MyCountTimertimeCount = new MyCountTimer(smsBtn, 0xfff30008, 0xff969696);//传入了文字颜色值
timeCount.start();
如时你不传入颜色值的话,也可以在点击按钮smsBtn的布局文件中根据按钮状态来设置颜色。
1
2
3
4
5
6
7
8
9
10
11
|
< Button android:id = "@+id/rebind_sms_btn" android:layout_width = "120dp" android:layout_height = "45dp" android:layout_marginLeft = "5dp" android:layout_marginRight = "5dp" android:background = "@null" android:gravity = "center" android:text = "获取短信验证码" android:textColor = "@color/hkb_binder_phone_text_color" android:textSize = "16sp" /> |
文字颜色对应的xml文件:
1
2
3
4
5
|
<? xml version = "1.0" encoding = "utf-8" ?> < selector xmlns:android = "http://schemas.android.com/apk/res/android" > < item android:state_enabled = "false" android:color = "#969696" /> < item android:color = "#f30008" /> </ selector > |
转自:http://www.open-open.com/code/view/1426335036826
在逛论坛的时候,看到一个网友提问,说到了CountDownTimer这个类,从名字上面大家就可以看出来,记录下载时间。将后台线程的创建和Handler队列封装成一个方便的类调用。
查看了一下官方文档,这个类及其简单,只有四个方法,上面都涉及到了onTick,onFinsh、cancel和start。其中前面两个是抽象方法,所以要重写一下。
下面是官方给的一个小例子:
- new CountdownTimer(30000, 1000) {
- public void onTick(long millisUntilFinished) {
- mTextField.setText(“seconds remaining: “ + millisUntilFinished / 1000);
- }
- public void onFinish() {
- mTextField.setText(“done!”);
- }
- }.start();
直接用的那位网友的代码,自己稍微改动了一下,一个简单的小demo。
- package cn.demo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.content.Intent;
- import android.os.CountDownTimer;
- import android.widget.TextView;
- import android.widget.Toast;
- public class NewActivity extends Activity {
- private MyCount mc;
- private TextView tv;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- tv = (TextView)findViewById(R.id.show);
- mc = new MyCount(30000, 1000);
- mc.start();
- }//end func
- /*定义一个倒计时的内部类*/
- class MyCount extends CountDownTimer {
- public MyCount(long millisInFuture, long countDownInterval) {
- super(millisInFuture, countDownInterval);
- }
- @Override
- public void onFinish() {
- tv.setText(“finish”);
- }
- @Override
- public void onTick(long millisUntilFinished) {
- tv.setText(“请等待30秒(“ + millisUntilFinished / 1000 + “)…”);
- Toast.makeText(NewActivity.this, millisUntilFinished / 1000 + “”, Toast.LENGTH_LONG).show();//toast有显示时间延迟
- }
- }
- }
主要是重写onTick和onFinsh这两个方法,onFinish()中的代码是计时器结束的时候要做的事情;onTick(Long m)中的代码是你倒计时开始时要做的事情,参数m是直到完成的时间,构造方法MyCount()中的两个参数中,前者是倒计的时间数,后者是倒计时onTick事件响应的间隔时间,都是以毫秒为单位。例如要倒计时30秒,每秒中间间隔时间是1秒,两个参数可以这样MyCount(30000,1000)。 将后台线程的创建和Handler队列封装成为了一个方便的类调用。
当你想取消的时候使用mc.cancel()方法就行了。
转自:http://blog.csdn.net/lilu_leo/article/details/6941724