效果如下图所示:
如图所示的效果相信大家都不陌生,我们可以使用很多种方法去实现此效果,这里自己采用 CountDownTimer 定时器简单封装下此效果,方便我们随时调用。
首页先在 attrs.xml 中定义下所需的几个属性:
代码语言:javascript复制<resources
<declare-styleable name="CountDownButton"
<attr name="millisinfuture" format="integer"/
<attr name="countdowninterva" format="integer"/
<attr name="normalColor" format="color"/
<attr name="countDownColor" format="color"/
</declare-styleable
</resources
下面是实现的具体代码,很简单的一种方式,通俗易懂:
代码语言:javascript复制/**
* Created by xiaolong on 2018/1/12.
*/
@SuppressLint("AppCompatCustomView")
public class CountDownButton extends Button{
//总时长
private long millisinfuture;
//间隔时长
private long countdowninterva;
//默认背景颜色
private int normalColor;
//倒计时 背景颜色
private int countDownColor;
//是否结束
private boolean isFinish;
//定时器
private CountDownTimer countDownTimer;
public CountDownButton(Context context) {
this(context,null);
}
public CountDownButton(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CountDownButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CountDownButton,defStyleAttr,0);
//设置默认时长
millisinfuture = (long) typedArray.getInt(R.styleable.CountDownButton_millisinfuture,60000);
//设置默认间隔时长
countdowninterva = (long)typedArray.getInt(R.styleable.CountDownButton_countdowninterva,1000);
//设置默认背景色
normalColor = typedArray.getColor(R.styleable.CountDownButton_normalColor,android.R.color.holo_blue_light);
//设置默认倒计时 背景色
countDownColor = typedArray.getColor(R.styleable.CountDownButton_countDownColor,android.R.color.darker_gray);
typedArray.recycle();
//默认为已结束状态
isFinish = true;
//字体居中
setGravity(Gravity.CENTER);
//默认文字和背景色
normalBackground();
//设置定时器
countDownTimer = new CountDownTimer(millisinfuture, countdowninterva) {
@Override
public void onTick(long millisUntilFinished) {
//未结束
isFinish = false;
setText((Math.round((double) millisUntilFinished / 1000) - 1) "秒");
setBackgroundResource(countDownColor);
}
@Override
public void onFinish() {
//结束
isFinish = true;
normalBackground();
}
};
}
private void normalBackground(){
setText("获取验证码");
setBackgroundResource(normalColor);
}
public boolean isFinish() {
return isFinish;
}
public void cancel(){
countDownTimer.cancel();
}
public void start(){
countDownTimer.start();
}
}
一个简单的调用方式:
代码语言:javascript复制public class MainActivity extends AppCompatActivity {
private CountDownButton countDownButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countDownButton = ((CountDownButton) findViewById(R.id.countDownButton));
countDownButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//这里判断是否倒计时结束,避免在倒计时时多次点击导致重复请求接口
if (countDownButton.isFinish()) {
//发送验证码请求成功后调用
countDownButton.start();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (!countDownButton.isFinish()) {
countDownButton.cancel();
}
}
}
这样一个简单的封装就结束了,过程很简单。这里主要是对 CountDownTimer 的使用练习,之前工作中一直没有接触过这个类。顺便贴上源码吧!
总结
以上所述是小编给大家介绍的Android 简单封装获取验证码倒计时功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!