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();
}
}
}