美文网首页
Android 实现倒计时

Android 实现倒计时

作者: 小熊_c37d | 来源:发表于2017-06-21 11:08 被阅读0次
    创建CountDownTimerUtils 传入TextView , 倒计时总时间,倒计时触发频率

    <code>

     CountDownTimerUtils mCountDownTimerUtils = new CountDownTimerUtils(TextView,   60000,1000);
     mCountDownTimerUtils.start();
    
    或者直接new CountDownTimer(6000, 1000)
      CountDownTimer countDownTimer= new CountDownTimer(6000, 1000) {
           @Override
            public void onTick(long millisUntilFinished) {
               //millisUntilFinished 倒计时剩余时间 
               }
    
            @Override
            public void onFinish() {
               //倒计时结束
               }
            };
           //启动倒计时
           countDownTimer.start();
    

    <code>


    time.gif
    继承CountDownTimer onTick 根据传入的倒计时频率触发改方法(频繁触发),onFinish倒计时结束触发该方法

    <code>

        import android.widget.TextView;
        
        import com.app.framework.R;
        
        
        public class CountDownTimerUtils extends CountDownTimer {
            private TextView mTextView;
        
        
            /**
             *
             * @param textView   控制的View
             * @param millisInFuture  开始时间
             * @param countDownInterval  倒计时触发频率
             */
            public CountDownTimerUtils(TextView textView, long millisInFuture, long countDownInterval) {
                super(millisInFuture, countDownInterval);
                this.mTextView = textView;
            }
        
            /**
             *
             * @param millisUntilFinished 剩余时间
             */
            @Override
            public void onTick(long millisUntilFinished) {
                mTextView.setClickable(false); //设置不可点击
                mTextView.setText(millisUntilFinished / 1000 +"");  //设置倒计时时间
                mTextView.setBackgroundResource(R.drawable.gray_bg); //设置按钮为灰色,这时是不能点击的
            }
        
        
            /**
             * 倒计时结束
             */
            @Override
            public void onFinish() {
                mTextView.setText("获取验证码");
                mTextView.setClickable(true);//重新获得点击
                mTextView.setBackgroundResource(R.drawable.blue_bg);  //还原背景色
            }
        }
    

    </code>

    通过Handler实现倒计时 提供抽象方法 onTick(频繁触发) ,onFinish(倒计时结束触发) 提供给外部

    <code>

    import android.os.Handler;
    import android.os.Message;
    import android.os.SystemClock;
    
    
    public abstract class CountDownTimer {
    
        /**
         * 倒计时总时间
         */
        private final long mMillisInFuture;
    
        /**
         * 倒计时 频率 时间
         */
        private final long mCountdownInterval;
    
    
        /**最大时间*/
        private long mStopTimeInFuture;
    
        /**
         * 当前倒计时的状态 默认false  结束状态
         */
        private boolean mCancelled = false;
    
        /**
         * @param millisInFuture 开始的时间
         * @param countDownInterval  倒计时触发频率
         */
        public CountDownTimer(long millisInFuture, long countDownInterval) {
            mMillisInFuture = millisInFuture;
            mCountdownInterval = countDownInterval;
        }
    
        /**
         * 取消倒计时
         */
        public synchronized final void cancel() {
            mCancelled = true;
            mHandler.removeMessages(MSG);
        }
    
        /**
         * 开始倒计时
         */
        public synchronized final CountDownTimer start() {
            mCancelled = false;
            if (mMillisInFuture <= 0) {
                onFinish();
                return this;
            }
    
            /**计算停止时间=系统运行时间+传入时间*/
            mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;
    
    
            mHandler.sendMessage(mHandler.obtainMessage(MSG));
            return this;
        }
    
    
        /**
         * 倒计时剩余时间
         * @param millisUntilFinished  剩余时间
         */
        public abstract void onTick(long millisUntilFinished);
    
        /**
         * 倒计时结束
         */
        public abstract void onFinish();
    
    
        private static final int MSG = 1;
    
    
        private Handler mHandler = new Handler() {
    
            @Override
            public void handleMessage(Message msg) {
    
                synchronized (this) {
                    /**判断倒计时是否结束  如果结束 直接结束*/
                    if (mCancelled) {
                        return;
                    }
                    /**获取剩余时间*/
                    final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
    
    
                    /**剩余时间小于或者等于0 调用onFinish() 代表倒计时结束*/
                    if (millisLeft <= 0) {
                        onFinish();
    
                    } else if (millisLeft < mCountdownInterval) {
                        /**剩余时间小于 倒计时频率时间 发送结束消息*/
                        sendMessageDelayed(obtainMessage(MSG), millisLeft);
                    } else {
    
                        /**获取当前运行的时间*/
                        long lastTickStart = SystemClock.elapsedRealtime();
    
                        /**调用onTick 方法 将剩余时间交给外部扩展*/
                        onTick(millisLeft);
    
                        /**考虑到用户的onTick花时间去执行计算执行onTick的时间*/
                        long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();
    
                        /**用户执行onTick方法的时间超过的倒计时频率时间    如果执行时间大于1秒 发送消息就时间就改为 onTick 执行时间+倒计时频率时间  相当于倒计时频率时间减去onTick已经消耗的时间 */
                        while (delay < 0) delay += mCountdownInterval;
                        /**发送消息  delay毫秒 */
                        sendMessageDelayed(obtainMessage(MSG), delay);
                    }
                }
            }
        };
    }
    

    </code>

    相关文章

      网友评论

          本文标题:Android 实现倒计时

          本文链接:https://www.haomeiwen.com/subject/zmpzqxtx.html