TimeButton,button

來源:互聯網
上載者:User

TimeButton,button

公司項目裡面需要用到倒計時按鈕,自己本來用 Handler + Runnable ,總感覺很麻煩,後來瞭解到API裡提供了倒計時的功能(CountDownTimer), 在後面貼上了。 先看一下我們實現的帶有倒計時功能的按鈕: 很簡單,就是調用了CountDownTimer。

package com.helper.view;import android.content.Context;import android.graphics.Color;import android.os.CountDownTimer;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.widget.Button;/** * Created by deadline on 2015/8/28. * 帶有倒計時的功能的按鈕 */public class TimeButton extends Button {    private static final int DEFAULT_COUNTDOWN = 60;    private int countDown;    private int beforeColor;    private int afterColor;    private CountDownTimer timer;    public TimeButton(Context context) {        this(context, null);    }    public TimeButton(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public TimeButton(final Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        beforeColor = Color.DKGRAY;        afterColor = Color.parseColor("#0085cf");        countDown = DEFAULT_COUNTDOWN;        setTextColor(beforeColor);        setText("擷取驗證碼");        timer = new CountDownTimer(countDown * 1000, 1000) {            @Override            public void onTick(long millisUntilFinished) {  //剩下的時間以毫秒為單位                setText(String.valueOf(millisUntilFinished / 1000) + "s後可重新擷取");            }            @Override            public void onFinish() {                setEnabled(true);                setTextColor(afterColor);                setText("重新擷取驗證碼");            }        };    }    /**     * 開始倒計時     * 0秒看不到,直接轉為可點擊狀態即可     */    public void startCountdown()    {        setTextColor(beforeColor);        setEnabled(false);   //設定不可點擊        timer.start();    }    public void stop(){        timer.cancel();    }    public int getCountDown() {        return countDown;    }    public void setCountDown(int countDown) {        this.countDown = countDown;    }    public int getAfterColor() {        return afterColor;    }    public void setAfterColor(int afterColor) {        this.afterColor = afterColor;    }    public int getBeforeColor() {        return beforeColor;    }    public void setBeforeColor(int beforeColor) {        this.beforeColor = beforeColor;    }}
package android.os;/** * Schedule a countdown until a time in the future, with * regular notifications on intervals along the way. * * Example of showing a 30 second countdown in a text field: * * <pre class="prettyprint"> * new CountDownTimer(30000, 1000) { * *     public void onTick(long millisUntilFinished) { *         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000); *     } * *     public void onFinish() { *         mTextField.setText("done!"); *     } *  }.start(); * </pre> * * The calls to {@link #onTick(long)} are synchronized to this object so that * one call to {@link #onTick(long)} won't ever occur before the previous * callback is complete.  This is only relevant when the implementation of * {@link #onTick(long)} takes an amount of time to execute that is significant * compared to the countdown interval. */public abstract class CountDownTimer {    /**     * Millis since epoch when alarm should stop.     */    private final long mMillisInFuture;    /**     * The interval in millis that the user receives callbacks     */    private final long mCountdownInterval;    private long mStopTimeInFuture;    /**    * boolean representing if the timer was cancelled    */    private boolean mCancelled = false;    /**     * @param millisInFuture The number of millis in the future from the call     *   to {@link #start()} until the countdown is done and {@link #onFinish()}     *   is called.     * @param countDownInterval The interval along the way to receive     *   {@link #onTick(long)} callbacks.     */    public CountDownTimer(long millisInFuture, long countDownInterval) {        mMillisInFuture = millisInFuture;        mCountdownInterval = countDownInterval;    }    /**     * Cancel the countdown.     */    public synchronized final void cancel() {        mCancelled = true;        mHandler.removeMessages(MSG);    }    /**     * Start the countdown.     */    public synchronized final CountDownTimer start() {        mCancelled = false;        if (mMillisInFuture <= 0) {            onFinish();            return this;        }        mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;        mHandler.sendMessage(mHandler.obtainMessage(MSG));        return this;    }    /**     * Callback fired on regular interval.     * @param millisUntilFinished The amount of time until finished.     */    public abstract void onTick(long millisUntilFinished);    /**     * Callback fired when the time is up.     */    public abstract void onFinish();    private static final int MSG = 1;    // handles counting down    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            synchronized (CountDownTimer.this) {                if (mCancelled) {                    return;                }                final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();                if (millisLeft <= 0) {                    onFinish();                } else if (millisLeft < mCountdownInterval) {                    // no tick, just delay until done                    sendMessageDelayed(obtainMessage(MSG), millisLeft);                } else {                    long lastTickStart = SystemClock.elapsedRealtime();                    onTick(millisLeft);                    // take into account user's onTick taking time to execute                    long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();                    // special case: user's onTick took more than interval to                    // complete, skip to next interval                    while (delay < 0) delay += mCountdownInterval;                    sendMessageDelayed(obtainMessage(MSG), delay);                }            }        }    };}

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.