1. 程式人生 > >Android開發:驗證碼倒計時功能實現

Android開發:驗證碼倒計時功能實現

前言

現在好多個APP裡面都有驗證碼倒計時按鈕,實現方式大概有下面幾種:

  • 1.使用執行緒和Handler的方式,定時重新整理倒計時數字,這種方式容易導致記憶體洩露,所以一般都使用弱引用,控制數字的重新整理。
  • 2、自定義倒計時按鈕
  • 3、使用Android提供的CountDownTimer結合TextView實現倒計時功能

這篇主要就是說下用第三種方式實現,簡單好用

效果圖

這裡寫圖片描述

實現

以下是核心程式碼:

/**
 * Created by hfs on 2017/5/9.
 */

public class TimeCount extends CountDownTimer {
    private
Button button; private String tickText; private String finishText; /** * @param millisInFuture 倒計時總時長 * @param countDownInterval 倒計時單位 毫秒. */ public TimeCount(long millisInFuture, long countDownInterval, Button button,String tickText,String finishText) { super
(millisInFuture, countDownInterval); this.button = button; this.tickText=tickText; this.finishText=finishText; } @Override public void onTick(long millisUntilFinished) { button.setText(millisUntilFinished / 1000 + tickText); button.setEnabled(false); } @Override
public void onFinish() { button.setEnabled(true); button.setText(finishText); } }

我自己又簡單的封裝成了一個自定義的Button,以後直接用著個自定義的Button即可

/**
 * Created by hfs on 2017/5/9.
 */

public class CountDownButton extends Button {

    private TimeCount mTimeCount;
    private long millisInFuture = 60000;
    private long countDownInterval = 1000;
    private String mTickText = "s後重新獲取";
    private String mFinishText = "重新獲取";

    public CountDownButton(Context context) {
        super(context);
        init(context);
    }

    public CountDownButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public CountDownButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {

    }

    /**
     * 設定倒計時多少毫秒結束
     * 預設60秒
     *
     * @param millisInFuture 毫秒
     */
    public void setMillisInFuture(long millisInFuture) {
        this.millisInFuture = millisInFuture;
    }

    /**
     * 設定倒計時間隔
     * 預設1秒
     *
     * @param countDownInterval 倒計時間隔
     */
    public void setCountDownInterval(long countDownInterval) {
        this.countDownInterval = countDownInterval;
    }

    /**
     * 設定倒計時過程中button顯示內容
     * @param text 預設 s後重新獲取
     */
    public void setOnTickText(String text) {
        this.mTickText=text;
    }

    /**
     * 設定倒計時結束button顯示內容
     * @param finishText 預設 重新獲取
     */
    public void setOnFinishText(String finishText){
        this.mFinishText=finishText;
    }



    public void startCount() {
        mTimeCount = new TimeCount(millisInFuture, countDownInterval, this, mTickText, mFinishText);
        mTimeCount.start();
    }

}

使用方法很簡單,就幾行程式碼即可:

public class MainActivity extends AppCompatActivity {

    private CountDownButton mCountDownButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mCountDownButton = (CountDownButton) findViewById(R.id.btn_count_down);
        mCountDownButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCountDownButton.startCount();
            }
        });
    }
}