Android 自定义获取验证码倒计时按钮

 

import android.content.Context;
import android.os.CountDownTimer;
import android.support.v7.widget.AppCompatButton;
import android.util.AttributeSet;

/**
 * Created by Administrator on 2017/5/25.
 * 倒时间button
 *
 * 倒计时提示:
 * setHintText()
 * 开始计时
 * onStart()
 * 结束计时
 * onCancel()
 *请务必在activity或fragment的onDestroy()方法里执行onCancel()方法
 * 其他方法和button一样,包括设置背景色和文字颜色等
 * 
 *
 *  使用方法:
 *  CountDownButton timerButton = findViewById(R.id.TimerButton);
 * timerButton.setHintText("%d秒后重新获取"); //不设置的话,默认为“xx秒后重新获取”
 * timerButton.setCountdownTime(60); //不设置默认为60秒
 * timerButton.setText("获取验证码");
 * timerButton.setOnClickListener(new View.OnClickListener() {
 * @Override
 * public void onClick(View v) {
 * //开始倒计时
 * timerButton.onStart();
 * }
 * });
 *
 * 在activity或fragment的onDestroy()方法里执行onCancel()方法
 *  protected void onDestroy() {
 *     super.onDestroy();
 *     timerButton.onCancel();
 *  }
 *
 */

public class CountDownButton extends AppCompatButton {

    private String text;
    private String hint = "%d秒后重新获取";
    private int second = 60;
    private CountDownTimer timer;
    private String baseText = "";

    public CountDownButton(Context context) {
        this(context,null);
    }

    public CountDownButton(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.buttonStyle);
    }

    public CountDownButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        baseText = getText().toString();
    }

    private void setHintCount(int i){
        String text = String.format(hint,i);
        setText(text);
    }

    public void setHintText(String hint){
        //hint格式为内容+%d,如:“%d秒后重新获取”
        this.hint = hint;
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        this.text = text.toString();
        super.setText(text, type);
    }

    public void setCountdownTime(int second) {
        this.second = second;
    }


    public void onStart(){
        baseText = getText().toString();
        if(timer == null){
            timer = getCountDownTimer(second);
        }
        timer.cancel();
        timer.start();
    }

    private CountDownTimer getCountDownTimer(int time){
        return new CountDownTimer(time*1000,1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                if(isClickable())
                setClickable(false);
                setHintCount((int)millisUntilFinished/1000);
            }

            @Override
            public void onFinish() {
                setClickable(true);
                setText(baseText);
            }
        };
    }

    public void onCancel(){
        if(timer != null){
            timer.cancel();
        }
    }


}

猜你喜欢

转载自blog.csdn.net/jingzz1/article/details/82997593