倒计时计时器

倒计时计时器很常用的一个场景是在发送验证码时,往往需要设计倒计时来给用户再次发送验证码,在某一段时间间隔之中,用户不允许对按钮进行再次点击或其他操作。
具体实现如下:
1-自定义一个接口,用来在接受对应方法中传来的相关控件

/**
 * 返回定时器相关控件的接口
 */
public interface ITimerUtilListener {
    public void getTimer(Timer timer,Handler handler,TimerTask task);
}

2-创建TimerUtil类,执行计时器的具体方法

public class TimerUtil {
    private Timer timer;
    private Handler handler;
    private TimerTask task;
    private TextView tv;
    private int i;
    public TimerUtil(final TextView tv) {
        this.tv = tv;
        handler = new Handler() {  
            public void handleMessage(Message msg) {  
                if (msg.what == 2) {
                    if(i>=0){
                        tv.setText("等待"+Integer.toString(--i)+"秒"); 
                        if(i == 0){
                            timer.cancel();
                            timer = null;
                            task = null;
                            tv.setEnabled(true);
                            tv.setText("重新发送验证码"); 

                        }
                    }else{
                        return;
                    }
                } else {
                    //这里相当于接受msg.what == 1时的处理
                    if(i>=0){
                        tv.setText("等"+Integer.toString(--i)+"分"); 
                        if(i == 0){
                            timer.cancel();
                            timer = null;
                            task = null;
                            tv.setEnabled(true);
                            tv.setText("重新发送验证码2"); 

                        }
                    }
                } 
                super.handleMessage(msg);  
            };  
        };  
    }

    /**
     * 设置验证码计时器
     */
    public void setMessageCodeTimeTask(final Context context,
            ITimerUtilListener listen) {
        tv.setEnabled(false);
        if(timer == null){
            timer = new Timer();
        }
        i = 10;
        if(task == null){
            task = new TimerTask() {  

                @Override  
                public void run() {  
                    // 需要做的事:发送消息  
                    Message message = new Message();  
                    message.what = 2;  
                    handler.sendMessage(message);  
                }  
            };
        }
        if(timer != null && task != null){
            timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行  
        }
        listen.getTimer(timer,handler,task);
    }

    public void setMessageCodeTimeTask2(final Context context,
            ITimerUtilListener listen) {
        tv.setEnabled(false);
        if(timer == null){
            timer = new Timer();
        }
        i = 10;
        if(task == null){
            task = new TimerTask() {  

                @Override  
                public void run() {  
                    // 需要做的事:发送消息  
                    Message message = new Message();  
                    message.what = 1;  
                    handler.sendMessage(message);  
                }  
            };
        }
        if(timer != null && task != null){
            timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行  
        }
        listen.getTimer(timer,handler,task);
    }


}

3-MainActivity 中创建相应的TextView或继承自TextView的控件(如Button),在控件的点击事件中执行TimerUtil类中的方法,并将ITimerUtilListener接口中的控件传回,赋给MainActivity中的控件。
PS:TimerUtil 类中参数可以自定义传入其他控件,而不仅仅局限于传TextView。因此处的TimerUtil 类传入的是TextView,故必须传入TextView相关的控件。

public class MainActivity extends Activity {

    TextView tv_timerTest;
    Button btn_click;
    Timer timer;
    Handler handler;
    TimerTask task; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_timerTest = (TextView) findViewById(R.id.tv_timerTest);
        btn_click = (Button) findViewById(R.id.btn_click);


    }
    @Override
    protected void onResume() {
        tv_timerTest.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //实现点击倒计时
                TimerUtil util = new TimerUtil(tv_timerTest);
                util.setMessageCodeTimeTask( 
                        MainActivity.this,new ITimerUtilListener() {

                    @Override
                    public void getTimer(Timer timer,Handler handler,TimerTask task) {
                        MainActivity.this.timer = timer;
                        MainActivity.this.handler = handler;
                        MainActivity.this.task = task;
                    }
                });             
            }
        });
        btn_click.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                //实现点击倒计时
                TimerUtil util = new TimerUtil(btn_click);
                util.setMessageCodeTimeTask2( 
                        MainActivity.this,new ITimerUtilListener() {

                    @Override
                    public void getTimer(Timer timer,Handler handler,TimerTask task) {
                        MainActivity.this.timer = timer;
                        MainActivity.this.handler = handler;
                        MainActivity.this.task = task;
                    }
                }); 
            }
        });

        super.onResume();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML 倒计时计时器是一种常用的倒计时功能,可以在网页中显示指定时间的倒计时,并提醒用户时间的到来。一般来说,倒计时计时器可以使用 JavaScript 来实现。以下是实现 HTML 倒计时计时器的基本步骤: 1. 在 HTML 中创建一个显示倒计时的容器,例如 div 或 span 标签。 2. 使用 JavaScript 获取当前时间和目标时间,并计算它们之间的时间差。 3. 将时间差转换为可读格式,并将其显示在倒计时容器中。 4. 使用 setInterval() 函数定时更新倒计时容器中的时间,直到倒计时结束。 下面是一个简单的 HTML 倒计时计时器的示例代码: ``` <div id="countdown"></div> <script> // 设置目标时间为 2022 年 1 月 1 日 0 时 0 分 0 秒 var targetDate = new Date("2022-01-01T00:00:00Z"); // 每秒更新倒计时容器中的时间 setInterval(function() { // 获取当前时间和目标时间之间的时间差 var timeDiff = targetDate - new Date(); // 将时间差转换为可读格式 var days = Math.floor(timeDiff / (1000 * 60 * 60 * 24)); var hours = Math.floor((timeDiff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((timeDiff % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((timeDiff % (1000 * 60)) / 1000); // 将可读格式的时间显示在倒计时容器中 document.getElementById("countdown").innerHTML = days + "天 " + hours + "小时 " + minutes + "分 " + seconds + "秒"; }, 1000); </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值