/* * Copyright (C) 2013 Peng fei Pan * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.lazylibrary.util; import android.os.Handler; import android.widget.TextView; /** * 倒计时器 */ public class Countdown implements Runnable { private int remainingSeconds; private int currentRemainingSeconds; private boolean running; private String defaultText; private String countdownText; private TextView showTextView; private Handler handler; private CountdownListener countdownListener; private TextViewGetListener textViewGetListener; /** * 创建一个倒计时器 * @param showTextView 显示倒计时的文本视图 * @param countdownText 倒计时中显示的内容,例如:"%s秒后重新获取验证码",在倒计时的过程中会用剩余描述替换%s * @param remainingSeconds 倒计时秒数,例如:60,就是从60开始倒计时一直到0结束 */ public Countdown(TextView showTextView, String countdownText, int remainingSeconds){ this.showTextView = showTextView; this.countdownText = countdownText; this.remainingSeconds = remainingSeconds; this.handler = new Handler(); } /** * 创建一个倒计时器 * @param textViewGetListener 显示倒计时的文本视图获取监听器 * @param countdownText 倒计时中显示的内容,例如:"%s秒后重新获取验证码",在倒计时的过程中会用剩余描述替换%s * @param remainingSeconds 倒计时秒数,例如:60,就是从60开始倒计时一直到0结束 */ public Countdown(TextViewGetListener textViewGetListener, String countdownText, int remainingSeconds){ this.textViewGetListener = textViewGetListener; this.countdownText = countdownText; this.remainingSeconds = remainingSeconds; this.handler = new Handler(); } /** * 创建一个倒计时器,默认60秒 * @param showTextView 显示倒计时的文本视图 * @param countdownText 倒计时中显示的内容,例如:"%s秒后重新获取验证码",在倒计时的过程中会用剩余描述替换%s */ public Countdown(TextView showTextView, String countdownText){ this(showTextView, countdownText, 60); } /** * 创建一个倒计时器,默认60秒 * @param textViewGetListener 显示倒计时的文本视图获取监听器 * @param countdownText 倒计时中显示的内容,例如:"%s秒后重新获取验证码",在倒计时的过程中会用剩余描述替换%s */ public Countdown(TextViewGetListener textViewGetListener, String countdownText){ this(textViewGetListener, countdownText, 60); } private TextView getShowTextView(){ if(showTextView != null){ return showTextView; } if(textViewGetListener != null){ return textViewGetListener.OnGetShowTextView(); } return null; } @Override public void run() { if(currentRemainingSeconds > 0){ getShowTextView().setEnabled(false); getShowTextView().setText( String.format(countdownText, currentRemainingSeconds)); if(countdownListener != null){ countdownListener.onUpdate(currentRemainingSeconds); } currentRemainingSeconds--; handler.postDelayed(this, 1000); }else{ stop(); } } public void start(){ defaultText = (String) getShowTextView().getText(); currentRemainingSeconds = remainingSeconds; handler.removeCallbacks(this); handler.post(this); if(countdownListener != null){ countdownListener.onStart(); } running = true; } public void stop(){ getShowTextView().setEnabled(true); getShowTextView().setText(defaultText); handler.removeCallbacks(this); if(countdownListener != null){ countdownListener.onFinish(); } running = false; } public boolean isRunning() { return running; } public int getRemainingSeconds() { return remainingSeconds; } public String getCountdownText() { return countdownText; } public void setCountdownText(String countdownText) { this.countdownText = countdownText; } public void setCurrentRemainingSeconds(int currentRemainingSeconds) { this.currentRemainingSeconds = currentRemainingSeconds; } public void setCountdownListener(CountdownListener countdownListener) { this.countdownListener = countdownListener; } /** * 倒计时监听器 */ public interface CountdownListener{ /** * 当倒计时开始 */ public void onStart(); /** * 当倒计时结束 */ public void onFinish(); /** * 更新 * @param currentRemainingSeconds 剩余时间 */ public void onUpdate(int currentRemainingSeconds); } public interface TextViewGetListener{ public TextView OnGetShowTextView(); } }