当前位置: 首页 > news >正文

178网站建设/百度搜索收录

178网站建设,百度搜索收录,wordpress首页随机推荐,自适应网页设计规范前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式。 对面前面的正向计时方法没有了解的,可以直接传送门:http://www.cnblogs.com/liushilin/p/5802954.html 虽然最近写的…

前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式。

对面前面的正向计时方法没有了解的,可以直接传送门:http://www.cnblogs.com/liushilin/p/5802954.html

 

虽然最近写的都比较简单和基础,不过简单不代表熟悉,基础不代表就会,大牛绕过,哈,中牛小牛也可以绕过,这个是写给初学者的。

先搞个效果图。

 

代码实现方式也超级简单啦,这里首推第一种实现方式,而且也是比较适合大家的,就是通过直接继承CountDownTimer来实现。

对于CountDownTimer这个类很简单,继承它的时候必须重写构造方法和实现其虚拟方法。

构造方法的两个参数分别是(倒计时开始时间,间隔时间)

另外两个方法分别是onTick(现在还剩的时间),计时结束后你想做的时间可以在onFinish()中做。

值的注意的是,所有的时间都是以毫秒形式来做的,所以在你使用的时候要记得整除1000取商。

不过由于我使用的是私有内部类的方式对外部类存在引用,为了防止内存泄漏,在Activity销毁的时候应该注意对其置空,同样我们也应该避免重复创建对象

另外一种方式还是使用我们常用的Handler + Thread的方式来实现。不过实现的时候同样要非常小心内存泄漏,因为如果用户在销毁Activity的时候应该注意让其计时子线程不再循环,这个可以通过设置一个tag标签对其判断。

这样在销毁的时候把这个tag标签置为false,结束线程的执行!

 

下面是实现代码:

  1 package com.example.nanchen.timerdemo;
  2 
  3 import android.os.Bundle;
  4 import android.os.CountDownTimer;
  5 import android.os.Handler;
  6 import android.os.Message;
  7 import android.support.v7.app.AppCompatActivity;
  8 import android.view.View;
  9 import android.view.View.OnClickListener;
 10 import android.widget.Button;
 11 
 12 public class MainActivity extends AppCompatActivity {
 13 
 14     private Button mBtnGetCode;
 15     private TimeCount mTimeCount;
 16     private Button mBtnGetCode2;
 17     private boolean timeFlag = true;
 18 
 19     @Override
 20     protected void onCreate(Bundle savedInstanceState) {
 21         super.onCreate(savedInstanceState);
 22         setContentView(R.layout.activity_main);
 23 
 24         mBtnGetCode = (Button) findViewById(R.id.main_btn_get_code);
 25         mBtnGetCode.setOnClickListener(new OnClickListener() {
 26             @Override
 27             public void onClick(View v) {
 28                 mTimeCount = null;
 29                 mTimeCount = new TimeCount(60 * 1000, 1000);
 30                 mTimeCount.start();
 31             }
 32         });
 33 
 34         mBtnGetCode2 = (Button) findViewById(R.id.main_btn_get_code_2);
 35         mBtnGetCode2.setOnClickListener(new OnClickListener() {
 36             @Override
 37             public void onClick(View v) {
 38                 mBtnGetCode2.setClickable(false);
 39                 mBtnGetCode2.setBackgroundColor(getResources().getColor(R.color.btn_unable));
 40                 timeFlag = true;
 41                 new Thread() {
 42                     @Override
 43                     public void run() {
 44                         super.run();
 45                         for (int i = 59; i >= 0 && timeFlag; i--) {
 46                             try {
 47                                 sleep(1000);
 48                                 Message msg = Message.obtain();
 49                                 msg.what = i;
 50                                 mHandler.sendMessage(msg);
 51                             } catch (InterruptedException e) {
 52                                 e.printStackTrace();
 53                             }
 54                         }
 55                     }
 56                 }.start();
 57             }
 58         });
 59     }
 60 
 61     private Handler mHandler = new Handler() {
 62         @Override
 63         public void handleMessage(Message msg) {
 64             super.handleMessage(msg);
 65             if (msg.what > 0) {
 66                 mBtnGetCode2.setText("(" + msg.what + ")秒后重试");
 67             } else {
 68                 mBtnGetCode2.setText("获取验证码");
 69                 mBtnGetCode2.setClickable(true);
 70                 mBtnGetCode2.setBackgroundColor(getResources().getColor(R.color.colorAccent));
 71             }
 72         }
 73 
 74 
 75     };
 76 
 77 
 78     /**
 79      * Activity 销毁的时候注意把所有引用置为空,防止内存泄漏
 80      */
 81     @Override
 82     protected void onDestroy() {
 83         super.onDestroy();
 84         mTimeCount = null;
 85         timeFlag = false;
 86     }
 87 
 88     /**
 89      * 实现倒计时的类
 90      */
 91     private class TimeCount extends CountDownTimer {
 92 
 93         /**
 94          * @param millisInFuture    The number of millis in the future from the call
 95          *                          to {@link #start()} until the countdown is done and {@link #onFinish()}
 96          *                          is called.
 97          * @param countDownInterval The interval along the way to receive
 98          *                          {@link #onTick(long)} callbacks.
 99          */
100         public TimeCount(long millisInFuture, long countDownInterval) {
101             super(millisInFuture, countDownInterval);
102         }
103 
104         /**
105          * 计时过程显示  按钮不可用 设置为灰色
106          *
107          * @param millisUntilFinished
108          */
109         @Override
110         public void onTick(long millisUntilFinished) {
111             mBtnGetCode.setClickable(false);
112             mBtnGetCode.setBackgroundColor(getResources().getColor(R.color.btn_unable));
113             mBtnGetCode.setText("(" + millisUntilFinished / 1000 + ")秒后重试");
114         }
115 
116         /**
117          * 计时结束调用
118          */
119         @Override
120         public void onFinish() {
121             mBtnGetCode.setClickable(true);
122             mBtnGetCode.setText("获取验证码方式1");
123             mBtnGetCode.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
124         }
125     }
126 
127 
128 }

 

简单看一下xml文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:id="@+id/activity_main"
 6     android:layout_width="match_parent"
 7     android:layout_height="match_parent"
 8     tools:context="com.example.nanchen.timerdemo.MainActivity">
 9 
10     <Button
11         android:layout_marginTop="10dp"
12         android:layout_width="match_parent"
13         android:layout_height="wrap_content"
14         android:id="@+id/main_btn_get_code"
15         android:text="获取验证码方式1"
16         android:background="@color/colorPrimaryDark"/>
17 
18     <TextView
19         android:layout_width="match_parent"
20         android:layout_height="1dp"
21         android:id="@+id/main_line1"
22         android:background="@color/btn_unable"
23         android:layout_below="@+id/main_btn_get_code"
24         android:layout_marginTop="10dp"/>
25 
26     <Button
27         android:layout_width="match_parent"
28         android:layout_height="wrap_content"
29         android:layout_below="@+id/main_line1"
30         android:layout_marginTop="10dp"
31         android:text="获取验证码方式2"
32         android:id="@+id/main_btn_get_code_2"
33         android:background="@color/colorAccent"/>
34 
35 </RelativeLayout>

 

 

写在最后:虽然代码和实现都非常简单,你可能不费吹灰之力,不过倘若转载的话,还是留个本文链接吧~thank you!

github链接:https://github.com/nanchen2251/TimerDemo

本文原创链接:http://www.cnblogs.com/liushilin/p/5951646.html

 

http://www.lbrq.cn/news/952921.html

相关文章:

  • 做视频可以领钱的网站/谷歌网页版入口在线
  • 做网站的流程前端做什么/全网热搜榜第一名
  • 网站开发流程步骤 口袋/近几天的新闻摘抄
  • 智慧团建网站入口pc端/销售课程视频免费
  • 闵行区网站/百度一下你就知道官网百度
  • wordpress固定链接设置失败/网站优化员seo招聘
  • 企业工商信息查询/网站seo需要用到哪些工具
  • 怎么删除网站的死链/搜索网络如何制造
  • 网站设计制作开发/郑州网站推广优化公司
  • 越野车网站模板/百度网站认证
  • 网站开发公司云鲸互创实惠/蚌埠网络推广
  • 云南网站建设哪家权威/网络营销的定义
  • 杭州网站建设科技有限公司/百度网盘搜索引擎入口
  • 小米路由器3做网站/免费手游推广平台
  • 电商网站更适合/新闻最新消息
  • 网站开发方向和移动开发方向那个好/推广公司
  • 做新闻类网站还有市场吗/媒体吧软文平台
  • 镇江个人网站制作/seo的全称是什么
  • 做网站有发票吗/运营商大数据精准营销
  • 新上线网站如何做搜索引擎/百度seo怎么把关键词优化上去
  • dw可以做网站后台吗/汽车seo是什么意思
  • 视频发布播放网站建设/外贸网站都有哪些
  • 做旅游网站设计的感想/今日头条热搜榜
  • 怎样在百度能搜到自己的网站/天津百度
  • 中国企业新闻观察网/上首页seo
  • 网站建设的价/自己创建一个网站需要多少钱
  • 网站制作样板/seo网站关键词优化哪家好
  • ie浏览器哪个做网站稳定/广东广州网点快速网站建设
  • 找人做的网站怎么/百度一下百度搜索百度
  • 六安做网站的/2023网站分享
  • Windows CMD(命令提示符)中最常用的命令汇总和实战示例
  • ZooKeeper学习专栏(二):深入 Watch 机制与会话管理
  • Vue3.6 无虚拟DOM模式
  • 多目标轨迹优化车道变换规划:自动驾驶轨迹规划新范式:基于Frenet坐标系的车道变换算法全解析
  • 【Kafka】深入理解 Kafka MirrorMaker2 - 实战篇
  • 【AI】文生图文生视频