├── .gitignore ├── README.md ├── TimerTest.iml ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── cjj │ │ └── timertest │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── cjj │ │ └── timertest │ │ ├── DownTimer.java │ │ └── MainActivity.java │ └── res │ ├── layout │ └── activity_main.xml │ ├── menu │ └── menu_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | .DS_Store 4 | /build 5 | /captures 6 | /.idea 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Timer 2 | ============================ 3 | 一个倒计时类,除了可以开始取消倒计时,还可以暂停恢复倒计时,虽说时间一去不复返,我丫停停它总可以吧!为什么有暂停时间这种需求呢?一般来说,我们发送验证码,会有倒计时,一般都是90秒,这种一般只要开始,等结束就可以了。然后没收到,我们在重发!但是像玩游戏倒计时,有时候你有120秒玩游戏,中途比如你有别的任务,也就是支线要玩,但你又不想结束主线,毕竟都快把boss打到半条血了,所以,如果有个暂停时间,在恢复时间的,那就比较人性化了,这只是一个例子,其实可用的场景很多,啊哈哈。 4 | 5 | 使用说明 6 | ---------------------------------------- 7 | (1) 首先实例化DownTimer ,设置总的倒计时数字和多少秒后回调。 8 | ```java 9 | DownTimer timer = new DownTimer();//实例化 10 | timer.setTotalTime(60*1000);//设置毫秒数 11 | timer.setIntervalTime(1000);//设置间隔数 12 | timer.setTimerLiener(new DownTimer.TimeListener() { 13 | @Override 14 | public void onFinish() { 15 | Toast.makeText(MainActivity.this, "完成倒计时", Toast.LENGTH_SHORT).show(); 16 | } 17 | @Override 18 | public void onInterval(long remainTime) { 19 | tv_scend.setText("还剩" + remainTime / 1000+"秒就完成了");//剩余多少毫秒 20 | } 21 | }); 22 | ``` 23 | 24 | (2) 然后就可以开始,结束,暂停,恢复 timer 了 25 | 26 | timer.start(); 27 | 28 | timer.pause(); 29 | 30 | timer.cancel(); 31 | 32 | timer.resume(); 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /TimerTest.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 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 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 22 5 | buildToolsVersion "23.0.0 rc3" 6 | 7 | defaultConfig { 8 | applicationId "com.cjj.timertest" 9 | minSdkVersion 9 10 | targetSdkVersion 22 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | compile 'com.android.support:appcompat-v7:22.2.1' 25 | } 26 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\as\sdk-install/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/cjj/timertest/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.cjj.timertest; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/cjj/timertest/DownTimer.java: -------------------------------------------------------------------------------- 1 | package com.cjj.timertest; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | import android.os.SystemClock; 6 | import android.util.Log; 7 | 8 | /** 9 | * DownTimer 10 | * @author cjj 11 | * @category 倒计时工具类 12 | * @version 1.0 13 | * @content 14 | * 1.实例化后必须设置倒计时的总时间(totalTime)和每隔多久时间(intervalTime)回调
15 | * 2.有start()、 cancel()、 pause()、resume() 四个方法看方法就知道它的意思了 16 | */ 17 | public class DownTimer { 18 | private long totalTime = -1; 19 | private long intervalTime = 0; 20 | private long remainTime; 21 | private long systemAddTotalTime; 22 | private static final int TIME = 1; 23 | private TimeListener listener; 24 | private long curReminTime; 25 | private boolean isPause = false; 26 | 27 | public DownTimer() { 28 | } 29 | 30 | public void setIntervalTime(long intervalTime) { 31 | this.intervalTime = intervalTime; 32 | } 33 | 34 | public void setTotalTime(long totalTime) { 35 | this.totalTime = totalTime; 36 | } 37 | 38 | public long getIntervalTime() { 39 | return intervalTime; 40 | } 41 | 42 | public long getTotalTime() { 43 | return totalTime; 44 | } 45 | 46 | public void start() { 47 | if (totalTime <= 0 && intervalTime <= 0) { 48 | throw new RuntimeException("you must set the totalTime > 0 or intervalTime >0"); 49 | } 50 | 51 | systemAddTotalTime = SystemClock.elapsedRealtime() + totalTime; 52 | 53 | if (null != mHandler) 54 | mHandler.sendEmptyMessage(TIME); 55 | } 56 | 57 | public void cancel() { 58 | if(mHandler !=null) 59 | { 60 | mHandler.removeMessages(TIME); 61 | mHandler = null; 62 | } 63 | 64 | } 65 | 66 | public void pause() { 67 | if(mHandler !=null) 68 | { 69 | mHandler.removeMessages(TIME); 70 | isPause = true; 71 | curReminTime = remainTime; 72 | } 73 | 74 | } 75 | 76 | public void resume() { 77 | if (isPause == true) { 78 | isPause = false; 79 | totalTime = curReminTime; 80 | start(); 81 | } 82 | 83 | } 84 | 85 | private Handler mHandler = new Handler() { 86 | 87 | @Override 88 | public void handleMessage(Message msg) { 89 | switch (msg.what) { 90 | case TIME: 91 | if (!isPause) 92 | soloveTime(); 93 | break; 94 | case 2: 95 | isPause = true; 96 | break; 97 | default: 98 | break; 99 | } 100 | } 101 | }; 102 | 103 | 104 | private void soloveTime() { 105 | remainTime = systemAddTotalTime - SystemClock.elapsedRealtime(); 106 | if (remainTime <= 0) { 107 | if (listener != null) { 108 | listener.onFinish(); 109 | cancel(); 110 | } 111 | } else if (remainTime < intervalTime) { 112 | if (null != mHandler) 113 | mHandler.sendEmptyMessageDelayed(TIME, remainTime); 114 | } else { 115 | long curSystemTime = SystemClock.elapsedRealtime(); 116 | if (listener != null) { 117 | listener.onInterval(remainTime); 118 | } 119 | 120 | long delay = curSystemTime + intervalTime - SystemClock.elapsedRealtime(); 121 | 122 | while (delay < 0) delay += intervalTime; 123 | 124 | if (null != mHandler) { 125 | mHandler.sendEmptyMessageDelayed(TIME, delay); 126 | } 127 | } 128 | } 129 | 130 | public interface TimeListener { 131 | public void onFinish(); 132 | public void onInterval(long remainTime); 133 | } 134 | 135 | public void setTimerLiener(TimeListener listener) { 136 | this.listener = listener; 137 | } 138 | 139 | } 140 | -------------------------------------------------------------------------------- /app/src/main/java/com/cjj/timertest/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.cjj.timertest; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.os.Bundle; 7 | import android.util.Log; 8 | import android.view.Menu; 9 | import android.view.MenuItem; 10 | import android.view.View; 11 | import android.widget.Button; 12 | import android.widget.TextView; 13 | import android.widget.Toast; 14 | 15 | import java.util.Timer; 16 | import java.util.TimerTask; 17 | 18 | public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 19 | private DownTimer timer; 20 | @Override 21 | public void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_main); 24 | final TextView tv_scend = (TextView) findViewById(R.id.text1); 25 | tv_scend.setText("总共一分钟"); 26 | timer = new DownTimer();//实例化 27 | timer.setTotalTime(60*1000);//设置毫秒数 28 | timer.setIntervalTime(1000);//设置间隔数 29 | timer.setTimerLiener(new DownTimer.TimeListener() { 30 | @Override 31 | public void onFinish() { 32 | Toast.makeText(MainActivity.this, "完成倒计时", Toast.LENGTH_SHORT).show(); 33 | } 34 | 35 | @Override 36 | public void onInterval(long remainTime) { 37 | tv_scend.setText("还剩" + remainTime / 1000+"秒就完成了");//剩余多少秒 38 | } 39 | }); 40 | 41 | } 42 | 43 | @Override 44 | public void onClick(View v) { 45 | switch (v.getId()) 46 | { 47 | case R.id.start: 48 | timer.start(); 49 | break; 50 | case R.id.pause: 51 | timer.pause(); 52 | break; 53 | case R.id.cancel: 54 | timer.cancel(); 55 | break; 56 | case R.id.resume: 57 | timer.resume(); 58 | break; 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 14 | 15 | 16 |