TimeButton, button

Source: Internet
Author: User

TimeButton, button

The countdown button is needed in the company's project. Handler + Runnable is used, which is always very troublesome. Later, I learned that the CountDownTimer function is provided in the API and pasted on it. Let's take a look at the button with the countdown function: Very simple, that is, CountDownTimer is called.

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. * Button with countDown function */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 ("Get Verification Code"); timer = new CountDownTimer (countDown * 1000,100 0) {@ Override public void onTick (long millisUntilFinished) {// The remaining time is in milliseconds. setText (String. valueOf (millisUntilFinished/1000) + "s can be retrieved again");} @ Override public void onFinish () {setEnabled (true); setTextColor (afterColor ); setText ("re-obtain Verification Code") ;};}/ *** Start countdown * 0 seconds not visible, directly switch to clickable status */public void startCountdown () {setTextColor (beforeColor); setEnabled (false); // you cannot click 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);                }            }        }    };}

Copyright Disclaimer: This article is an original article by the blogger and cannot be reproduced without the permission of the blogger.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

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.