效果图
CountDownTimer类
Java自带的倒计时器类,使用方法如下:
- 继承该类,初始化参数
super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔
重写两个方法
onTick(long millisUntilFinished) //计时过程中执行的方法
和onFinish() //计时结束执行的方法
。使用:
TimeCoutn time = new TimeCount(60000,1000); time.start();
实现
定义属性
<declare-styleable name="TimingButton">
<!--结束后的文字-->
<attr name="tb_psText" format="string" />
<!--计时总时长,毫秒-->
<attr name="tb_totalTime" format="integer" />
<!--计时时间间隔,毫秒-->
<attr name="tb_timeInterval" format="integer" />
</declare-styleable>
默认样式
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
<shape android:shape="rectangle">
<solid android:color="@color/colorAccent" />
<corners android:radius="6dp" />
</shape>
</item>
<item android:state_enabled="false">
<shape android:shape="rectangle">
<solid android:color="@color/base_gray" />
<corners android:radius="6dp" />
</shape>
</item>
</selector>
继承Button实现自定义View
/**
* @author DeMon
* @date 2018/6/26
* @description 倒计时按钮
*/
@SuppressLint("AppCompatCustomView")
public class TimingButton extends Button {
private int total, interval;
private String psText;
public TimingButton(Context context, AttributeSet attrs) {
super(context, attrs);
// 获取自定义属性,并赋值
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.TimingButton);
total = typedArray.getInteger(R.styleable.TimingButton_tb_totalTime, 60000);
interval = typedArray.getInteger(R.styleable.TimingButton_tb_timeInterval, 1000);
psText = typedArray.getString(R.styleable.TimingButton_tb_psText);
setBackgroundResource(R.drawable.timing_button); //设置默认样式
typedArray.recycle();
}
//执行
public void start() {
TimeCount time = new TimeCount(total, interval);
time.start();
}
public class TimeCount extends CountDownTimer {
private long countDownInterval;
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔
this.countDownInterval = countDownInterval;
}
@Override
public void onFinish() {//计时完毕时触发
setText(psText);
setEnabled(true);
}
@SuppressLint("SetTextI18n")
@Override
public void onTick(long millisUntilFinished) {//计时过程显示
setEnabled(false);
setText(millisUntilFinished / countDownInterval + "秒");
}
}
}
如何使用
<com.demon.baseui.view.TimingButton
android:id="@+id/btn"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="获取验证码"
android:textColor="@color/base_white"
android:textSize="20sp"
app:tb_psText="重新获取"
app:tb_totalTime="5000" />
TimingButton btn;
...
btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn.start();
}
});
总结
- 也可以使用Timer或者Handler实现,但是不如CountDownTimer方便。
- 除新增了额外的三个属性,其余跟Button完全一致。
- 直接复制即可使用,代码比较简单就不放源码了。